This commit is contained in:
2025-06-13 16:54:10 +03:00
parent c1bedf0534
commit 17a549c8f6

106
app.py
View File

@@ -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()