diff --git a/app.py b/app.py index 08500a4..3c8be49 100644 --- a/app.py +++ b/app.py @@ -1,6 +1,6 @@ import tkinter as tk -from tkinter import simpledialog, messagebox -from PIL import Image, ImageTk +from tkinter import simpledialog, messagebox, ttk +from PIL import Image, ImageTk, ImageDraw, ImageFont import barcode from barcode.writer import ImageWriter import cups @@ -11,31 +11,69 @@ def get_printers(): return list(conn.getPrinters().keys()) def print_label(printer_name, text): - # Generate barcode image + # Generate barcode image without text CODE128 = barcode.get_barcode_class('code128') code = CODE128(text, writer=ImageWriter()) - filename = code.save('label_barcode') + filename = code.save('label_barcode', options={"write_text": False}) - # Create label image with text and barcode - barcode_img = Image.open(filename + '.png') - label_img = Image.new('RGB', (barcode_img.width, barcode_img.height + 40), 'white') + # Load barcode image + barcode_img = Image.open(filename) + # Set font path (adjust if needed) + try: + font = ImageFont.truetype("arialbd.ttf", 32) # Arial Black, 24pt + except IOError: + font = ImageFont.load_default() + # Calculate text size + draw = ImageDraw.Draw(barcode_img) + text_width, text_height = draw.textbbox((0, 0), text, font=font)[2:] + # Create label image with extra space for text + label_height = barcode_img.height + text_height + 10 + label_img = Image.new('RGB', (barcode_img.width, label_height), 'white') label_img.paste(barcode_img, (0, 0)) - - # Add text below barcode - from PIL import ImageDraw, ImageFont + # Draw text centered under barcode draw = ImageDraw.Draw(label_img) - font = ImageFont.load_default() - w, h = draw.textsize(text, font=font) - draw.text(((barcode_img.width - w) // 2, barcode_img.height + 10), text, fill='black', font=font) - + x = (barcode_img.width - text_width) // 2 + y = barcode_img.height + 5 + draw.text((x, y), text, font=font, fill='black') label_img.save('final_label.png') # Print using CUPS conn = cups.Connection() conn.printFile(printer_name, 'final_label.png', "Label Print", {}) - os.remove(filename + '.png') + os.remove(filename) os.remove('final_label.png') +def show_preview(image_path): + preview = tk.Toplevel() + preview.title("Label Preview") + img = Image.open(image_path) + img_tk = ImageTk.PhotoImage(img) + label = tk.Label(preview, image=img_tk) + label.image = img_tk # Keep reference + label.pack() + btn = tk.Button(preview, text="Print", command=preview.destroy) + btn.pack() + preview.grab_set() + preview.wait_window() + +def select_printer(printers): + dialog = tk.Toplevel() + dialog.title("Select Printer") + tk.Label(dialog, text="Select a printer:").pack(padx=10, pady=5) + printer_var = tk.StringVar() + combo = ttk.Combobox(dialog, textvariable=printer_var, values=printers, state="readonly") + combo.pack(padx=10, pady=5) + combo.current(0) + selected = {'printer': None} + def on_ok(): + selected['printer'] = printer_var.get() + dialog.destroy() + btn = tk.Button(dialog, text="OK", command=on_ok) + btn.pack(pady=10) + dialog.grab_set() + dialog.wait_window() + return selected['printer'] + def main(): root = tk.Tk() root.withdraw() @@ -45,18 +83,48 @@ def main(): messagebox.showerror("Error", "No printers found.") return - printer = simpledialog.askstring("Printer", f"Available printers:\n{printers}\nEnter printer name:") - if printer not in printers: - messagebox.showerror("Error", "Invalid printer selected.") + printer = select_printer(printers) + if not printer: + messagebox.showerror("Error", "No printer selected.") return text = simpledialog.askstring("Label Text", "Enter text for the label:") if not text: messagebox.showerror("Error", "No text entered.") return - + + # Generate label image for preview + CODE128 = barcode.get_barcode_class('code128') + code = CODE128(text, writer=ImageWriter()) + filename = code.save('label_barcode', options={"write_text": False}) + barcode_img = Image.open(filename) + # Set font path (adjust if needed) + try: + font = ImageFont.truetype("arialbd.ttf", 32) # Arial Black, 24pt + except IOError: + font = ImageFont.load_default() + # Calculate text size + draw = ImageDraw.Draw(barcode_img) + text_width, text_height = draw.textbbox((0, 0), text, font=font)[2:] + # Create label image with extra space for text + label_height = barcode_img.height + text_height + 10 + label_img = Image.new('RGB', (barcode_img.width, label_height), 'white') + label_img.paste(barcode_img, (0, 0)) + # Draw text centered under barcode + draw = ImageDraw.Draw(label_img) + x = (barcode_img.width - text_width) // 2 + y = barcode_img.height + 5 + draw.text((x, y), text, font=font, fill='black') + label_img.save('final_label.png') + os.remove(filename) + + # Show preview window + show_preview('final_label.png') + + # Print after preview print_label(printer, text) messagebox.showinfo("Done", "Label sent to printer.") + os.remove('final_label.png') if __name__ == "__main__": main() \ No newline at end of file