this has a new import feature with values... will document soon!

This commit is contained in:
trav 2023-11-21 22:51:08 -05:00
parent e0a71464c6
commit 6ec59f3d7a
6 changed files with 141 additions and 51 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 29 KiB

188
kiosk6.py
View File

@ -32,6 +32,9 @@ class Kiosk(tk.Tk):
self.geometry('1366x768') self.geometry('1366x768')
self.attributes('-fullscreen', True) self.attributes('-fullscreen', True)
self.config(cursor="crosshair") self.config(cursor="crosshair")
self.QRX = None
self.QRY = None
self.QRscale = 1
globals()['BUTTON_FONT'] = tkfont.Font(size=24, family='Helvetica') globals()['BUTTON_FONT'] = tkfont.Font(size=24, family='Helvetica')
globals()['TEXT_FONT'] = tkfont.Font(size=20, family='Helvetica') globals()['TEXT_FONT'] = tkfont.Font(size=20, family='Helvetica')
self.switch_frame(Screen0) self.switch_frame(Screen0)
@ -340,7 +343,7 @@ class Screen4(tk.Frame):
global TEXT_FONT global TEXT_FONT
# Configure column minsizes # Configure column minsizes
self.grid_columnconfigure(0, minsize=665) # considering 675 width + 50 padding on each side self.grid_columnconfigure(0, minsize=675) # considering 675 width + 50 padding on each side
self.grid_columnconfigure(1, minsize=100) self.grid_columnconfigure(1, minsize=100)
self.grid_columnconfigure(2, minsize=100) self.grid_columnconfigure(2, minsize=100)
@ -356,13 +359,13 @@ class Screen4(tk.Frame):
tk.Button(self.left_frame, text="Import Image", command=self.import_image, height=2, width=15, bg='peach puff', font=BUTTON_FONT).pack(pady=10) tk.Button(self.left_frame, text="Import Image", command=self.import_image, height=2, width=15, bg='peach puff', font=BUTTON_FONT).pack(pady=10)
# Add instructions # Add instructions
self.label = tk.Label(self.left_frame, text="You may now draw your sticker :) This will be printed ~ 1.25 by 2.25 inches. You can include contact info for yourself, the name of the item, a drawing, or whatever you want, it's your artistic expression. You might have better results using thicker lines (see drawing tools on the right). In the bottom right of the sticker will be a small QR code which links to the Scuttlebutt post for your item. The image you are drawing now will not be posted to Scuttlebutt.", self.label = tk.Label(self.left_frame, text="You may now draw your sticker :) This will be printed ~ 1.25 by 2.25 inches. You might have better results using thicker lines (see drawing tools on the right). The image you are drawing now will not be posted to Scuttlebutt.",
wraplength=650, # adjust to suit needs wraplength=650, # adjust to suit needs
font=TEXT_FONT) font=TEXT_FONT)
self.label.pack(pady=2) self.label.pack(pady=2)
# is this the drawing area # is this the drawing area
self.drawing = Image.new('1', (635, 360), 1) self.drawing = Image.new('1', (650, 360), 1)
self.draw = ImageDraw.Draw(self.drawing) self.draw = ImageDraw.Draw(self.drawing)
self.last_draw = None self.last_draw = None
@ -371,7 +374,7 @@ class Screen4(tk.Frame):
self.draw_size = 1 self.draw_size = 1
# Creating the Canvas for drawing # Creating the Canvas for drawing
self.canvas = Canvas(self.left_frame, width=635, height=360, bg='white') self.canvas = Canvas(self.left_frame, width=650, height=360, bg='white')
self.canvas.bind("<B1-Motion>", self.draw_line) self.canvas.bind("<B1-Motion>", self.draw_line)
self.image_on_canvas = None # To store imported image's reference self.image_on_canvas = None # To store imported image's reference
self.canvas.pack(pady=20) self.canvas.pack(pady=20)
@ -382,6 +385,11 @@ class Screen4(tk.Frame):
self.buttons_frame = tk.Frame(self.right_frame, bg='#bcfef9') self.buttons_frame = tk.Frame(self.right_frame, bg='#bcfef9')
self.buttons_frame.pack(pady=50) self.buttons_frame.pack(pady=50)
# Define the info_label to display QRX, QRY, and QRscale values
self.info_label = tk.Label(self.right_frame, text="", bg='#bcfef9', font=TEXT_FONT)
self.info_label.pack(pady=5) # Use pack instead of grid
# Add Draw Size buttons # Add Draw Size buttons
tk.Button(self.buttons_frame, text=".", command=lambda: self.set_draw_size(1), height=3, width=10, bg='peach puff').grid(row=0, column=0, padx=5, pady=5) tk.Button(self.buttons_frame, text=".", command=lambda: self.set_draw_size(1), height=3, width=10, bg='peach puff').grid(row=0, column=0, padx=5, pady=5)
tk.Button(self.buttons_frame, text="*", command=lambda: self.set_draw_size(2), height=3, width=10, bg='peach puff').grid(row=1, column=0, padx=5, pady=5) tk.Button(self.buttons_frame, text="*", command=lambda: self.set_draw_size(2), height=3, width=10, bg='peach puff').grid(row=1, column=0, padx=5, pady=5)
@ -403,7 +411,7 @@ class Screen4(tk.Frame):
tk.Button(self.right_frame, text="Done", command=self.next, height=3, width=10, bg='peach puff', font=BUTTON_FONT).pack(pady=10) tk.Button(self.right_frame, text="Done", command=self.next, height=3, width=10, bg='peach puff', font=BUTTON_FONT).pack(pady=10)
# Adding a home button # Adding a home button
master.add_home_button(self.right_frame) master.add_home_button(self)
def draw_line(self, event): def draw_line(self, event):
x, y = event.x, event.y x, y = event.x, event.y
@ -430,49 +438,73 @@ class Screen4(tk.Frame):
def clear_drawing(self): def clear_drawing(self):
self.canvas.delete("all") # Clear canvas self.canvas.delete("all") # Clear canvas
self.drawing = Image.new('1', (635, 360), 1) # Create new blank drawing image self.drawing = Image.new('1', (650, 360), 1) # Create new blank drawing image
self.draw = ImageDraw.Draw(self.drawing) # Prepare to draw on the new blank image self.draw = ImageDraw.Draw(self.drawing) # Prepare to draw on the new blank image
self.add_qr_box() # Add QR box to the canvas self.add_qr_box() # Add QR box to the canvas
def add_qr_box(self): # add_qr_box to accept coordinates and size
self.canvas.create_rectangle(506, 217, 627, 346, outline='black', fill='white') def add_qr_box(self, x=506, y=217, size=1):
self.canvas.create_text(540, 260, text="QR", fill="black") # Adjust the size based on QRscale
box_size = 37 * size
self.canvas.create_rectangle(x, y, x + box_size, y + box_size, outline='black', fill='white')
self.canvas.create_text(x + box_size/2, y + box_size/2, text="QR", fill="black")
def import_image(self): def import_image(self):
# Open file dialog to select an image file # Open file dialog to select an image file
file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg *.png")]) file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg *.jpeg *.png")])
if file_path: if not file_path: # Exit the method if no file is selected
# Check if the selected file has a correct extension return
if not (file_path.lower().endswith('.jpg') or file_path.lower().endswith('.png')):
tk.messagebox.showerror("Invalid file", "Please select a .jpg or .png file.")
return
# Load the image # Split the file path at hyphens and take the last three parts
img = Image.open(file_path) file_parts = file_path.split('-')[-4:]
# Convert to 1-bit black and white if len(file_parts) < 4:
img = img.convert('1') messagebox.showerror("Filename Error", "The filename does not follow the expected pattern.")
return
# Resize or crop the image to fit the canvas try:
if img.size[0] > 635 or img.size[1] > 360: # Extract and convert the numeric parts
img = img.crop((0, 0, 635, 360)) QRX = int(file_parts[1])
QRY = int(file_parts[2])
QRscale = int(file_parts[3].split('.')[0]) # Split at the dot and take the first part
# Paste the imported image onto the drawing image # Update the main application's QR data
self.drawing.paste(img) self.master.QRX = QRX
self.master.QRY = QRY
self.master.QRscale = QRscale
# Save image reference to avoid garbage collection # Display QRX, QRY, and QRscale values
self.imported_img = ImageTk.PhotoImage(img) self.info_label.config(text=f"QRX: {QRX}, QRY: {QRY}, QRscale: {QRscale}")
except ValueError as e:
messagebox.showerror("Filename Error", "The filename does not follow the expected pattern.")
return
# Clear the canvas # Clear the canvas
self.canvas.delete("all") self.canvas.delete("all")
# Load the image
img = Image.open(file_path)
# Convert to 1-bit black and white
img = img.convert('1')
# Resize or crop the image to fit the canvas
if img.size[0] > 675 or img.size[1] > 375:
img = img.crop((0, 0, 650, 360))
self.add_qr_box(QRX, QRY, QRscale)
# Add image to the canvas # Paste the imported image onto the drawing image
self.image_on_canvas = self.canvas.create_image(0, 0, image=self.imported_img, anchor='nw') self.drawing.paste(img)
# Re-add QR box overlay # Save image reference to avoid garbage collection
self.add_qr_box() self.imported_img = ImageTk.PhotoImage(img)
# Add image to the canvas
self.image_on_canvas = self.canvas.create_image(0, 0, image=self.imported_img, anchor='nw')
# add the QR box at the new position
self.add_qr_box(QRX, QRY, QRscale)
# typed description # typed description
class Screen5(tk.Frame): class Screen5(tk.Frame):
@ -505,6 +537,7 @@ class Screen5(tk.Frame):
info_text = info_text.replace('\n', '\\n') info_text = info_text.replace('\n', '\\n')
self.master.switch_frame(Screen11) self.master.switch_frame(Screen11)
# I understand
class Screen6(tk.Frame): class Screen6(tk.Frame):
def __init__(self, master): def __init__(self, master):
tk.Frame.__init__(self, master, bg='#bcfef9') tk.Frame.__init__(self, master, bg='#bcfef9')
@ -513,6 +546,7 @@ class Screen6(tk.Frame):
master.add_home_button(self) master.add_home_button(self)
tk.Button(self, text="I Understand", command=lambda: master.switch_frame(Screen3), height=3, width=30, bg='peach puff', font=BUTTON_FONT).pack(pady=10) tk.Button(self, text="I Understand", command=lambda: master.switch_frame(Screen3), height=3, width=30, bg='peach puff', font=BUTTON_FONT).pack(pady=10)
# create user not implemented lol
class Screen7(tk.Frame): class Screen7(tk.Frame):
def __init__(self, master): def __init__(self, master):
tk.Frame.__init__(self, master, bg='#bcfef9') tk.Frame.__init__(self, master, bg='#bcfef9')
@ -530,6 +564,9 @@ class Screen8(tk.Frame):
def __init__(self, master): def __init__(self, master):
global BUTTON_FONT global BUTTON_FONT
global TEXT_FONT global TEXT_FONT
# default set QRscale to 8
QRscale = 8
tk.Frame.__init__(self, master, bg='#bcfef9') tk.Frame.__init__(self, master, bg='#bcfef9')
# Creating a frame for the left side of the screen for drawing # Creating a frame for the left side of the screen for drawing
@ -545,11 +582,11 @@ class Screen8(tk.Frame):
self.right_frame.pack(side='left', padx=50) self.right_frame.pack(side='left', padx=50)
# Add instructions # Add instructions
self.label = tk.Label(self.center_frame, text="You may now draw your tag! You might like to include contact info for yourself, the name of the item, a drawing, or whatever you want, it's your artistic expression. Thin lines might not show up well (try different drawing tools on the right). In the bottom right of your tag will be a small QR code which links to the Scuttlebutt post for your item. The image you are drawing now will not be posted to Scuttlebutt.", wraplength=400, font=TEXT_FONT) self.label = tk.Label(self.center_frame, text="You may now draw your tag! You might like to include contact info for yourself, the name of the item, a drawing, or whatever you want, it's your artistic expression. Thin lines might not show up well (try different drawing tools on the right).", wraplength=400, font=TEXT_FONT)
self.label.pack(pady=50) self.label.pack(pady=30)
# the drawing area # the drawing area
self.drawing = Image.new('1', (475, 375), 1) self.drawing = Image.new('1', (325, 179), 1)
self.draw = ImageDraw.Draw(self.drawing) self.draw = ImageDraw.Draw(self.drawing)
self.last_draw = None self.last_draw = None
@ -558,16 +595,20 @@ class Screen8(tk.Frame):
self.draw_size = 1 self.draw_size = 1
# Creating the Canvas for drawing # Creating the Canvas for drawing
self.canvas = Canvas(self.left_frame, width=475, height=375, bg='white') self.canvas = Canvas(self.left_frame, width=325, height=179, bg='white')
self.canvas.bind("<B1-Motion>", self.draw_line) self.canvas.bind("<B1-Motion>", self.draw_line)
self.canvas.pack(pady=20) self.canvas.pack(pady=20)
self.canvas.bind("<ButtonRelease-1>", self.reset_last_draw) self.canvas.bind("<ButtonRelease-1>", self.reset_last_draw)
self.add_qr_box() # Add QR box to the canvas # self.add_qr_box() # Add QR box to the canvas
#Create a frame for the buttons grid #Create a frame for the buttons grid
self.buttons_frame = tk.Frame(self.right_frame, bg='#bcfef9') self.buttons_frame = tk.Frame(self.right_frame, bg='#bcfef9')
self.buttons_frame.pack(pady=10) self.buttons_frame.pack(pady=10)
# Add Import Image Button
tk.Button(self.buttons_frame, text="Import Image", command=self.import_image, height=2, width=15, bg='peach puff', font=BUTTON_FONT).grid(row=4, column=0, columnspan=2, pady=10, sticky='ew')
# Add Draw Size buttons # Add Draw Size buttons
tk.Button(self.buttons_frame, text=".", command=lambda: self.set_draw_size(1), height=3, width=10, bg='peach puff').grid(row=0, column=0, padx=5, pady=5) tk.Button(self.buttons_frame, text=".", command=lambda: self.set_draw_size(1), height=3, width=10, bg='peach puff').grid(row=0, column=0, padx=5, pady=5)
tk.Button(self.buttons_frame, text="*", command=lambda: self.set_draw_size(2), height=3, width=10, bg='peach puff').grid(row=1, column=0, padx=5, pady=5) tk.Button(self.buttons_frame, text="*", command=lambda: self.set_draw_size(2), height=3, width=10, bg='peach puff').grid(row=1, column=0, padx=5, pady=5)
@ -624,6 +665,44 @@ class Screen8(tk.Frame):
self.canvas.create_rectangle(346, 229, 475, 358, outline='black', fill='white') self.canvas.create_rectangle(346, 229, 475, 358, outline='black', fill='white')
self.canvas.create_text(355, 260, text="QR", fill="black") self.canvas.create_text(355, 260, text="QR", fill="black")
def import_image(self):
# Open file dialog to select an image file
file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg *.png")])
if file_path:
# Check if the selected file has a correct extension
if not (file_path.lower().endswith('.jpg') or file_path.lower().endswith('.png')):
tk.messagebox.showerror("Invalid file", "Please select a .jpg or .png file.")
return
# Load the image
img = Image.open(file_path)
# Convert to 1-bit black and white
img = img.convert('1')
# Resize or crop the image to fit the canvas
if img.size[0] > 325 or img.size[1] > 179:
img = img.crop((0, 0, 325, 179))
# Paste the imported image onto the drawing image
self.drawing.paste(img)
# Save image reference to avoid garbage collection
self.imported_img = ImageTk.PhotoImage(img)
# Clear the canvas
self.canvas.delete("all")
# Add image to the canvas
self.image_on_canvas = self.canvas.create_image(0, 0, image=self.imported_img, anchor='nw')
# Re-add QR box overlay
# self.add_qr_box()
# txt update # txt update
class Screen9(tk.Frame): class Screen9(tk.Frame):
def __init__(self, master): def __init__(self, master):
@ -691,6 +770,7 @@ class Screen13(tk.Frame):
global TEXT_FONT global TEXT_FONT
tk.Frame.__init__(self, master, bg='#bcfef9') tk.Frame.__init__(self, master, bg='#bcfef9')
master.add_home_button(self) master.add_home_button(self)
# Create a container to hold the widgets # Create a container to hold the widgets
container = tk.Frame(self) container = tk.Frame(self)
container.place(relx=0.5, rely=0.5, anchor='center') container.place(relx=0.5, rely=0.5, anchor='center')
@ -705,11 +785,16 @@ class Screen13(tk.Frame):
# go ahead and print the thing # go ahead and print the thing
def printy(self): def printy(self):
global print_type global print_type
# Specify the path to your image file # Specify the path to your image file
path_to_image = "/home/trav/Documents/custodiosk/freeze_frame.jpg" path_to_image = "/home/trav/Documents/custodiosk/freeze_frame.jpg"
# Get QR data from the main application
QRX = self.master.QRX
QRY = self.master.QRY
QRscale = self.master.QRscale
# make ssb post # make ssb post
key = addtoDB.addToSSB(path_to_image,info_text,1) key = addtoDB.addToSSB(path_to_image,info_text,1)
@ -722,8 +807,8 @@ class Screen13(tk.Frame):
qr = qrcode.QRCode( qr = qrcode.QRCode(
version = 1, version = 1,
error_correction = qrcode.constants.ERROR_CORRECT_H, error_correction = qrcode.constants.ERROR_CORRECT_H,
box_size = 3, box_size = QRscale,
border = 1, border = 0,
) )
# Add data # Add data
qr.add_data(key) qr.add_data(key)
@ -739,22 +824,27 @@ class Screen13(tk.Frame):
qr = Image.open("qr.jpg") # qr qr = Image.open("qr.jpg") # qr
#### merge em #### merge em
merged_image = Image.new('L', (675, 375), "white")
## if sticker ## if sticker
if print_type == "sticker": if print_type == "sticker":
merged_image.paste(drawing, (0, 0)) ## if we didn't custom set X/Y, set to defaults
merged_image.paste(qr, (506, 217)) if QRX is None and QRY is None:
QRX=506
QRY=217
merged_image = Image.new('L', (675, 375), "white")
merged_image.paste(drawing, (0, 8))
merged_image.paste(qr, (QRX, QRY+8)) # we add 8 because this is slightly off from when we drew it
merged_image.save("merged_image.png") merged_image.save("merged_image.png")
# if ribbon we gotta rotate 90 degrees and paste QR in different spot # if ribbon
if print_type == "ribbon": if print_type == "ribbon":
merged_image.paste(drawing, (100, 0)) merged_image = Image.new('L', (375, 675), "white")
merged_image.paste(qr, (446, 229)) # paste without mask merged_image.paste(drawing, (25, 100)) # set it 25 in because that's the border
merged_image.paste(qr, (25, 279)) # paste without mask
merged_image.save("merged_image.png") merged_image.save("merged_image.png")
image = Image.open("merged_image.png") image = Image.open("merged_image.png")
rotated_image = image.transpose(Image.ROTATE_270) # Transpose and rotate 90 degrees # rotated_image = image.transpose(Image.ROTATE_270) # Transpose and rotate 90 degrees, old version when we weren't doing ribbon vertical
rotated_image.save("merged_image.png") # rotated_image.save("merged_image.png")
# Get the ZPL code for the image # Get the ZPL code for the image
zpl_code = tozpl.print_to_zpl("merged_image.png") zpl_code = tozpl.print_to_zpl("merged_image.png")

BIN
merged_image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -54,7 +54,7 @@ then
ssb-server publish . <<BLAAB ssb-server publish . <<BLAAB
{ {
"type":"post", "type":"post",
"text":"This item is owned by $account", "text":"This item is stewarded by $account",
"custodisco":"true", "custodisco":"true",
"nft": "give", "nft": "give",
"target": "$account", "target": "$account",

File diff suppressed because one or more lines are too long