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

104
app.py
View File

@@ -1,6 +1,6 @@
import tkinter as tk import tkinter as tk
from tkinter import simpledialog, messagebox from tkinter import simpledialog, messagebox, ttk
from PIL import Image, ImageTk from PIL import Image, ImageTk, ImageDraw, ImageFont
import barcode import barcode
from barcode.writer import ImageWriter from barcode.writer import ImageWriter
import cups import cups
@@ -11,31 +11,69 @@ def get_printers():
return list(conn.getPrinters().keys()) return list(conn.getPrinters().keys())
def print_label(printer_name, text): def print_label(printer_name, text):
# Generate barcode image # Generate barcode image without text
CODE128 = barcode.get_barcode_class('code128') CODE128 = barcode.get_barcode_class('code128')
code = CODE128(text, writer=ImageWriter()) 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 # Load barcode image
barcode_img = Image.open(filename + '.png') barcode_img = Image.open(filename)
label_img = Image.new('RGB', (barcode_img.width, barcode_img.height + 40), 'white') # 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)) label_img.paste(barcode_img, (0, 0))
# Draw text centered under barcode
# Add text below barcode
from PIL import ImageDraw, ImageFont
draw = ImageDraw.Draw(label_img) draw = ImageDraw.Draw(label_img)
font = ImageFont.load_default() x = (barcode_img.width - text_width) // 2
w, h = draw.textsize(text, font=font) y = barcode_img.height + 5
draw.text(((barcode_img.width - w) // 2, barcode_img.height + 10), text, fill='black', font=font) draw.text((x, y), text, font=font, fill='black')
label_img.save('final_label.png') label_img.save('final_label.png')
# Print using CUPS # Print using CUPS
conn = cups.Connection() conn = cups.Connection()
conn.printFile(printer_name, 'final_label.png', "Label Print", {}) conn.printFile(printer_name, 'final_label.png', "Label Print", {})
os.remove(filename + '.png') os.remove(filename)
os.remove('final_label.png') 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(): def main():
root = tk.Tk() root = tk.Tk()
root.withdraw() root.withdraw()
@@ -45,9 +83,9 @@ def main():
messagebox.showerror("Error", "No printers found.") messagebox.showerror("Error", "No printers found.")
return return
printer = simpledialog.askstring("Printer", f"Available printers:\n{printers}\nEnter printer name:") printer = select_printer(printers)
if printer not in printers: if not printer:
messagebox.showerror("Error", "Invalid printer selected.") messagebox.showerror("Error", "No printer selected.")
return return
text = simpledialog.askstring("Label Text", "Enter text for the label:") text = simpledialog.askstring("Label Text", "Enter text for the label:")
@@ -55,8 +93,38 @@ def main():
messagebox.showerror("Error", "No text entered.") messagebox.showerror("Error", "No text entered.")
return 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) print_label(printer, text)
messagebox.showinfo("Done", "Label sent to printer.") messagebox.showinfo("Done", "Label sent to printer.")
os.remove('final_label.png')
if __name__ == "__main__": if __name__ == "__main__":
main() main()