Add Tkinter label designer with emoji picker
label_app.py: label size presets, multi-line text with auto-fit / bold / alignment, tabbed emoji picker (rendered via Noto Color Emoji, gamma-darkened and dithered for the thermal head), live 1-bit preview, save PNG, print in a background thread. Settings persist in ~/.config/niimprint-label/. main.py is the earlier minimal GUI it supersedes.
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
import tkinter as tk
|
||||
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
|
||||
from niimprint import BluetoothTransport, PrinterClient, prepare_print
|
||||
|
||||
|
||||
class LabelMaker:
|
||||
def __init__(self, root, model):
|
||||
self.root = root
|
||||
self.root.title("Label Maker")
|
||||
self.model = model
|
||||
self.transport = BluetoothTransport("94:11:02:66:16:4D")
|
||||
self.printer = PrinterClient(self.transport)
|
||||
self.label_text = tk.StringVar()
|
||||
self.label_text.set("Type your label here")
|
||||
self.create_widgets()
|
||||
|
||||
def print(self, density, rotate, image):
|
||||
image, density = prepare_print(self.model, Image.open(image), density, rotate)
|
||||
self.printer.print_image(image, density=density, model=self.model)
|
||||
|
||||
def create_widgets(self):
|
||||
# Text Entry
|
||||
label_entry = tk.Entry(self.root, textvariable=self.label_text, width=40)
|
||||
label_entry.pack(pady=10)
|
||||
|
||||
# Button to create label
|
||||
create_button = tk.Button(
|
||||
self.root, text="Create Label", command=self.create_label
|
||||
)
|
||||
create_button.pack(pady=10)
|
||||
|
||||
def create_label(self):
|
||||
label_text = self.label_text.get()
|
||||
|
||||
# Create image
|
||||
image = Image.new("RGB", (319, 95), "white")
|
||||
draw = ImageDraw.Draw(image)
|
||||
|
||||
# Set font (change the font path according to your system)
|
||||
font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"
|
||||
font_size = 20
|
||||
font = ImageFont.truetype(font_path, font_size)
|
||||
|
||||
# Calculate text position
|
||||
box = font.getbbox(label_text)
|
||||
# getbbox returns (left, top, right, bottom)
|
||||
font_width = box[2] - box[0]
|
||||
font_height = box[3] - box[1]
|
||||
x = (image.width - font_width) // 2
|
||||
y = (image.height - font_height) // 2
|
||||
|
||||
# Draw text on image
|
||||
draw.text((x - box[0], y - box[1]), label_text, font=font, fill="black")
|
||||
|
||||
# Save image or send it to the printer
|
||||
image.save("label.png")
|
||||
self.print(1, 90, "label.png")
|
||||
print("Label created and saved as label.png")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
root = tk.Tk()
|
||||
label_maker = LabelMaker(root, "d110")
|
||||
root.mainloop()
|
||||
Reference in New Issue
Block a user