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.
67 lines
2.1 KiB
Python
67 lines
2.1 KiB
Python
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()
|