""" SaveBarcodeWindow Class """
import tkinter
import tkinter.filedialog
from tkinter.messagebox import showwarning, showinfo
import os
from kalmus.tkinter_windows.gui_utils import resource_path
[docs]class SaveBarcodeWindow():
"""
SaveBarcodeWindow Class
GUI window for user to select the barcode to save into a json file that can be later loaded back to kalmus
"""
def __init__(self, barcode_stack):
"""
Initialize
:param barcode_stack: the dictionary that stored all the barcodes on the memory
"""
self.barcode_stack = barcode_stack
# Initialize the window
self.window = tkinter.Tk()
self.window.iconbitmap(resource_path("kalmus_icon.ico"))
self.window.wm_title("Save Barcode from Memory Stack")
# List box that lists all the barcodes stored on the memory (shows the barcode's key in the dictionary)
self.listbox = tkinter.Listbox(self.window, selectmode=tkinter.SINGLE, width=65, height=20)
self.listbox.grid(row=0, column=0, columnspan=4)
# List all the barcodes in the list box using their keys
for barcode_names in self.barcode_stack.keys():
self.listbox.insert(tkinter.END, barcode_names)
# Label prompt for the file name/path to the saved json file
filename_label = tkinter.Label(self.window, text="JSON file path: ")
filename_label.grid(row=1, column=0)
# Text entry for user to specify the file name/path to the saved json file
self.filename_entry = tkinter.Entry(self.window, textvariable="", width=40)
self.filename_entry.grid(row=1, column=1, columnspan=1, sticky=tkinter.W)
# Button to browse the location in a file manager
self.button_browse_folder = tkinter.Button(self.window, text="Browse", command=self.browse_folder)
self.button_browse_folder.grid(row=1, column=2, sticky=tkinter.W)
# Button to save the barcode into json file
self.button_save = tkinter.Button(master=self.window, text="Save Barcode", command=self.save_stack)
self.button_save.grid(row=2, column=0, sticky=tkinter.W)
[docs] def browse_folder(self):
"""
Browse the folders in a file manager window
"""
# Get the file name/path from the user input in the file manager
filename = tkinter.filedialog.asksaveasfilename(initialdir=".", title="Save JSON file",
filetypes=(("json files", "*.json"), ("txt files", "*.txt"),
("All files", "*.*")))
# Update the file name/path to the file name entry
self.filename_entry.delete(0, tkinter.END)
self.filename_entry.insert(0, filename)
[docs] def save_stack(self):
"""
Save the selected barcode from the memory stack to the json file
"""
# Get the dictionary key of the selected barcode
selected_barcode_names = [self.listbox.get(idx) for idx in self.listbox.curselection()]
if len(selected_barcode_names) <= 0:
return
# Get the file name/path to the saved json file from the user input
filename = self.filename_entry.get()
if len(filename) == 0:
showwarning("Default Saved JSON Path is Used", "Path to the saved JSON file is not specified.\n"
"Default save path is used.\n"
"File will be saved in the current working directory.\n"
"It is recommended to specify the file path.")
filename = None
# Saved the barcode
for barcode_name in selected_barcode_names:
barcode = self.barcode_stack[barcode_name]
if filename and (not filename.lower().endswith(".json")):
filename += ".json"
try:
barcode.save_as_json(filename)
except:
showwarning("Error Occurred in Saving Barcode", "An unknown Error occurred in saving barcode to "
"JSON object.\nPlease verify the file path and "
"make sure you have the permission to save file "
"at that directory.")
if not filename:
filename = "saved_{:s}_barcode_{:s}_{:s}.json" \
.format(barcode.barcode_type, barcode.frame_type, barcode.color_metric)
# Quit the window
self.window.destroy()
# Show success message
showinfo("JSON File Saved Successfully", "The JSON file is successfully saved.\n\n"
"The Path to the File: {:20s}".format(os.path.abspath(filename)))