Source code for kalmus.tkinter_windows.meta_info_windows.SpecifyMetaDataWindow
""" SpecifyMetaDataWindow class """
import tkinter
import copy
from kalmus.tkinter_windows.gui_utils import resource_path
# Available genre options
genres = ["Comedy", "Drama", "Western", "Science Fiction", "War", "Melodrama", "Mystery/Thriller", "Action/Adventure",
"Musical", "Romance", "Horror", "Other:"]
[docs]class SpecifyMetaDataWindow():
"""
SpecifyMetaDataWindow Class
GUI window for user to specify the meta information of the selected barcode
"""
def __init__(self, meta_data_dict, barcode=None, barcode_stacks=None):
"""
Initialize
:param meta_data_dict: The meta information dictionary of the barcode
:param barcode: The barcode
:param barcode_stacks: The dictionary that stored all the barcode on memory
"""
self.meta_data_dict = meta_data_dict
self.barcode = barcode
self.barcodes_stack = barcode_stacks
# Initialize the window
self.window = tkinter.Tk()
self.window.wm_title("Specify Meta Data")
self.window.iconbitmap(resource_path("kalmus_icon.ico"))
# Set up the label prompt for the film title specification
self.title_label = tkinter.Label(self.window, text="Film Title:")
self.title_label.grid(row=0, column=0, sticky=tkinter.W)
# Set up the the entry for user to specify the barcode's film title
self.title_entry = tkinter.Entry(self.window, textvariable="1", width=30)
self.title_entry.grid(row=0, column=1, sticky=tkinter.W)
# Set up the label prompt for the film director specification
self.directory_label = tkinter.Label(self.window, text="Directors:")
self.directory_label.grid(row=1, column=0, sticky=tkinter.W)
# Set up the entry user to specify the film director
self.directory_entry = tkinter.Entry(self.window, textvariable="2", width=30)
self.directory_entry.grid(row=1, column=1, sticky=tkinter.W)
# Set up the label prompt for the film's country of origin specification
self.country_origin_label = tkinter.Label(self.window, text="Country of Origin:")
self.country_origin_label.grid(row=2, column=0, sticky=tkinter.W)
# Set up the entry for user to specify the film's country of origin
self.country_origin_entry = tkinter.Entry(self.window, textvariable="3", width=30)
self.country_origin_entry.grid(row=2, column=1, sticky=tkinter.W)
# Set up the label prompt for the produced year specification
self.year_label = tkinter.Label(self.window, text="Produced Year:")
self.year_label.grid(row=3, column=0, sticky=tkinter.W)
# Set up the entry for user to specify the produced year of the film
self.year_entry = tkinter.Entry(self.window, textvariable="4", width=30)
self.year_entry.grid(row=3, column=1, sticky=tkinter.W)
# Set up the label prompt for the film genre specification
self.genre_label = tkinter.Label(self.window, text="Genre:")
self.genre_label.grid(row=4, column=0, sticky=tkinter.W)
# Genre variable
self.genre_var = tkinter.StringVar(self.window)
self.genre_var.set("Comedy")
self.genre_var.trace("w", callback=self.update_other_entry)
# Genre dropdown list
self.genre_dropdown = tkinter.OptionMenu(self.window, self.genre_var, *genres)
self.genre_dropdown.grid(row=4, column=1, sticky=tkinter.W)
# Other genre entry for user to specify a non-specified (custom) genre
self.other_entry = tkinter.Entry(self.window, textvariable="5", width=8, state="disabled")
self.other_entry.grid(row=4, column=2, sticky=tkinter.W)
# Update the meta data button
self.update_meta_button = tkinter.Button(master=self.window, text="Update Meta Info",
command=self.update_meta_info)
self.update_meta_button.grid(row=5, column=1)
[docs] def update_meta_info(self):
"""
Update the meta information of the barcode using user input
"""
# Get the user input
title = self.title_entry.get()
director = self.directory_entry.get()
country_of_origin = self.country_origin_entry.get()
year = self.year_entry.get()
genre = self.genre_var.get()
# For non empty input
# Update the data to the corresponding key in the meta data dictionary
if len(title) != 0:
self.meta_data_dict["Film Title"] = copy.deepcopy(title)
if len(director) != 0:
self.meta_data_dict["Directors"] = copy.deepcopy(director)
if len(country_of_origin) != 0:
self.meta_data_dict["Country of Origin"] = copy.deepcopy(country_of_origin)
if len(year) != 0:
self.meta_data_dict["Produced Year"] = copy.deepcopy(year)
if genre != "Other:":
self.meta_data_dict["Genre"] = copy.deepcopy(genre)
else:
if len(self.other_entry.get()) != 0:
self.meta_data_dict["Genre"] = copy.deepcopy(self.other_entry.get())
else:
self.meta_data_dict["Genre"] = copy.deepcopy("Other")
# If the barcode is given, update the meta data dictionary to the barcode's attributes
if self.barcode is not None:
self.barcode.__dict__["meta_data"] = copy.deepcopy(self.meta_data_dict)
# If the memory stack of the barcode is given, update the barcode to the memory stack
if self.barcodes_stack is not None:
key_barcode = str(title) + "_" + str(director) + "_" + str(country_of_origin)\
+ "_" + str(year) + "_" + str(genre) + "_modified_meta_info"
self.barcodes_stack[key_barcode] = copy.deepcopy(self.barcode)
# Quit the window
self.window.destroy()
[docs] def update_other_entry(self, *args):
"""
Enable the other genre entry once user select Other: in the dropdown list
:param args: required by the tkinter callback
"""
# Enable or disable the other genre entry based on the dropdown list selection
if self.genre_var.get() == "Other:":
self.other_entry.config(state="normal")
else:
self.other_entry.config(state="disabled")