Source code for kalmus.tkinter_windows.SaveImageWindow

""" SaveImageWindow Class """

import tkinter
from tkinter.messagebox import showerror, showinfo
import tkinter.filedialog
import matplotlib.pyplot as plt
import cv2
import os

from kalmus.tkinter_windows.gui_utils import resource_path


[docs]class SaveImageWindow(): """ SaveImageWindow Class Save the barcode into the image """ def __init__(self, barcode_1, barcode_2): """ Initialize :param barcode_1: The barcode 1 :param barcode_2: The barcode 2 """ # Initialize the window self.window = tkinter.Tk() self.window.iconbitmap(resource_path("kalmus_icon.ico")) self.window.wm_title("Save Image") self.barcode_1 = barcode_1 self.barcode_2 = barcode_2 # Label prompt for which barcode to save which_barcode_label = tkinter.Label(self.window, text="Barcode: ") which_barcode_label.grid(row=0, column=0, columnspan=1) # Barcode option variable self.barcode_option = tkinter.StringVar(self.window) self.barcode_option.set("Barcode 1") # Radio button for which barcode to save radio_barcode_1 = tkinter.Radiobutton(self.window, text="Barcode 1", variable=self.barcode_option, value="Barcode 1", command=self.update_size_entry) radio_barcode_1.grid(row=1, column=0) radio_barcode_1.select() radio_barcode_2 = tkinter.Radiobutton(self.window, text="Barcode 2", variable=self.barcode_option, value="Barcode 2", command=self.update_size_entry) radio_barcode_2.grid(row=2, column=0) # The width and height (in pixels) of the selected barcode width = self.barcode_1.get_barcode().shape[1] height = self.barcode_1.get_barcode().shape[0] # Resize the barcode into desirable size before saving self.resize_x_label = tkinter.Label(self.window, text="Saved Width (pixels): ") self.resize_x_label.grid(row=1, column=1, sticky=tkinter.E) self.resize_x_entry = tkinter.Entry(self.window, textvariable=-2, width=5) self.resize_x_entry.grid(row=1, column=2, padx=15, sticky=tkinter.W) self.resize_x_entry.insert(0, str(width)) self.resize_y_label = tkinter.Label(self.window, text="Saved Height (pixels): ") self.resize_y_label.grid(row=2, column=1, sticky=tkinter.E) self.resize_y_entry = tkinter.Entry(self.window, textvariable=-3, width=5) self.resize_y_entry.grid(row=2, column=2, padx=15, sticky=tkinter.W) self.resize_y_entry.insert(0, str(height)) # Label prompt for the file name (path) of the saved image filename_label = tkinter.Label(self.window, text="Image file path: ") filename_label.grid(row=3, column=0) # Text entry for user to specify the path of the saved image self.filename_entry = tkinter.Entry(self.window, textvariable="", width=40) self.filename_entry.grid(row=3, column=1, columnspan=1, sticky=tkinter.W) # Button to browse the location in a file manager window self.button_browse_folder = tkinter.Button(self.window, text="Browse", command=self.browse_folder) self.button_browse_folder.grid(row=3, column=2, sticky=tkinter.W) # Button to save the image into the given path using the given size self.button_save_image = tkinter.Button(master=self.window, text="Save Barcode", command=self.save_image) self.button_save_image.grid(row=4, column=0)
[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 Image file", filetypes=(("JPEG files", "*.jpg"), ("PNG files", "*.png"), ("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 update_size_entry(self): """ Update the size of current selected barcodes displayed in the resize entries """ # Find the current selected barcode # Update the width and height (in pixels) of that barcode in the resize entries if self.barcode_option.get() == "Barcode 1": width = self.barcode_1.get_barcode().shape[1] height = self.barcode_1.get_barcode().shape[0] elif self.barcode_option.get() == "Barcode 2": width = self.barcode_2.get_barcode().shape[1] height = self.barcode_2.get_barcode().shape[0] self.resize_x_entry.delete(0, tkinter.END) self.resize_x_entry.insert(0, width) self.resize_y_entry.delete(0, tkinter.END) self.resize_y_entry.insert(0, height)
[docs] def save_image(self): """ Save the currently selected barcode into the image with the given size """ # Check if the filename is given filename = self.filename_entry.get() if len(filename) == 0: showerror("File Name is Not Given", "Please specify the path to the saved image.") return # Get which barcode to save if self.barcode_option.get() == "Barcode 1": barcode = self.barcode_1.get_barcode().astype("uint8") barcode_type = self.barcode_1.barcode_type elif self.barcode_option.get() == "Barcode 2": barcode = self.barcode_2.get_barcode().astype("uint8") barcode_type = self.barcode_2.barcode_type # Resize the barcode into the desired shape (notice that the original barcode won't be affected) barcode = cv2.resize(barcode, dsize=(int(self.resize_x_entry.get()), int(self.resize_y_entry.get())), interpolation=cv2.INTER_NEAREST) # Save the barcode with desirable color map based on its barcode type if barcode_type == "Color": plt.imsave(filename, barcode) else: plt.imsave(filename, barcode, cmap="gray") # Quit the window self.window.destroy() showinfo("Image Saved Successfully", "The image is saved successfully.\n\n" "The Path to the Image: {:20s}".format(os.path.abspath(filename)))