Updated
This commit is contained in:
104
app.py
104
app.py
@@ -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()
|
||||||
Reference in New Issue
Block a user