ich habe ein Frage, die die Strukturierung meines Programmcodes betrifft.
In meiner Applikation habe ich Bereiche, die sich wie folgt aufbauen:
Eine Klasse MainFrame beinhaltet immer eine Klasse StatusFrame und DataFrame.
Im DataFrame werden alle Eingaben vom Nutzer gemacht und der StatusFrame soll ensprechend in Kurzform auflisten, was bereits vom Nutzer definiert/ eingegeben wurde.
Nun möchte ich bei Eingabe des Nutzers in ein Entry-Widget des DataFrame das Label-Widget des StatusFrame aktualisieren.
Ich habe dazu dem Entry ein StringVar() zugewiesen und diese "überwache" ich per trace()-Methode, um bei Änderungen dann das Label-Widget direkt anzupassen. Diese Methoden habe alle in die übergeordnete Klasse MainFrame gepackt.
( siehe Klasse MainFrame - die Methoden manage_binds_traces() & update_status_label() )
Nun zu meiner Frage:
Spricht irgendwas gegen diese Art der Strukturierung, wie sie unten im Detail zu sehen ist?
Dass ich die Kontrolle (trace()) im DataFrame und die Änderung des Label im StatusFrame im MainFrame abarbeite?
Oder sollte ich ggf. die trace()_methode im DataFrame selbst und die Änderung des Labels im StatusFrame getrennt behandeln?
Gruß Seb
Ps.: sorry für den langen Codeausschnitt...wollte f´ür´s Verständnis nicht zu viel rausnehmen.
Code: Alles auswählen
class MainFrame(tk.LabelFrame):
"""..."""
def __init__(self, parent, fonts):
super().__init__(parent)
self.parent = parent
self.fonts = fonts
self.config(text='Generic Specification', font=self.fonts['header'])
self.grid_rowconfigure((0, 1), weight=1)
self.columnconfigure(0, weight=1)
self.create_widgets()
self.manage_layout()
self.manage_binds_traces()
def create_widgets(self):
"""..."""
self.data_frame = DataFrame(self, self.fonts)
self.status_frame = StatusFrame(self, self.fonts, self.collapse_data_frame)
def manage_layout(self):
"""..."""
g_sticky = 'nswe'
self.status_frame.grid(row=0, column=0, sticky=g_sticky)
self.data_frame.grid(row=1, column=0, sticky=g_sticky)
def manage_binds_traces(self):
"""..."""
self.data_frame.nomenclature_var.trace('w', self.update_status_label)
#self.data_frame.nomenclature_var.bind('<FocusOut>', self.update_status_label)
def collapse_data_frame(self):
"""..."""
frame = self.data_frame
if frame.winfo_viewable():
frame.grid_remove()
else:
frame.grid()
def update_status_label(self, *args):
"""..."""
nomenclature = self.data_frame.nomenclature_var.get()
wheel_type = self.data_frame.wheel_type_var.get()
rot_dir = self.data_frame.rot_dir_var.get()
mb_count = self.data_frame.blade_count_var.get()
sb_count = self.data_frame.blade_count_splitter_var.get()
status_string = ('{nc}_{wt}_{rd} '
'| Count of MB: {mc} '
'| Count of SB: {sc}').format(nc=nomenclature,
wt=wheel_type,
rd=rot_dir,
mc=mb_count,
sc=sb_count)
self.status_frame.status_label.config(text=status_string)
####################################################################################################
class StatusFrame(tk.Frame):
"""..."""
def __init__(self, parent, fonts, collapse_main_frame_func):
super().__init__(parent)
self.parent = parent
self.fonts = fonts
self.collapse_main_frame = collapse_main_frame_func
self.config(padx=5, pady=5)
self.grid_columnconfigure(1, weight=1)
self.create_widgets()
self.manage_layout()
self.manage_binds_traces()
def create_widgets(self):
"""..."""
self.collapse_button = tk.Button(self, text='-', width=2,
command=self.collapse_main_frame)
self.status_label = tk.Label(self, text='defined', relief='ridge')
self.test_button = tk.Button(self, text='test')
def manage_layout(self):
"""..."""
g_sticky = 'nswe'
self.collapse_button.grid(row=0, column=0, sticky=g_sticky)
self.status_label.grid(row=0, column=1, sticky=g_sticky)
self.test_button.grid(row=0, column=3, sticky=g_sticky)
def manage_binds_traces(self):
"""..."""
self.collapse_button.bind('<Button-1>', self.toggle_button_text)
def toggle_button_text(self, event=None):
"""toggle the button text between + and -"""
btn = self.collapse_button
if btn.cget('text') == '-':
btn.config(text='+')
else:
btn.config(text='-')
####################################################################################################
class DataFrame(tk.Frame):#tk.LabelFrame):
"""..."""
def __init__(self, parent, fonts):
super().__init__(parent)
self.parent = parent
self.fonts = fonts
self.config()#text='Generic Specification', font=self.fonts['header'])
self.grid_rowconfigure(0, weight=1)
# config cols
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(1, weight=3)
for col in range(2, 6):
self.grid_columnconfigure(col, weight=1)
self.grid_columnconfigure((7, 9), weight=1, uniform='same_width_label')
self.grid_columnconfigure((8, 10), weight=1, uniform='same_width_entry')
self.create_widgets()
self.manage_layout()
# all ancestors of main frame
# self.all_removable_widgets = self.grid_slaves()
def create_widgets(self):
"""..."""
self.label_nomenclature = tk.Label(self, text='Nomenclature:', anchor='e')
self.nomenclature_var = tk.StringVar()
self.entry_nomenclature = tk.Entry(self, textvariable=self.nomenclature_var,
bg='light yellow', justify='center', width=10)
self.label_wheel_type = tk.Label(self, text='Type of Wheel:', anchor='e')
self.wheel_type_var = tk.StringVar()
self.entry_wheel_type = tk.Entry(self, textvariable=self.wheel_type_var,
bg='light yellow', justify='center', width=5)
self.label_rot_direction = tk.Label(self, text='Rotation Direction:', anchor='e')
self.rot_dir_var = tk.StringVar()
self.rot_dir_var.set('cw') # initial value
self.r_button_cw = tk.Radiobutton(self, text='cw', variable=self.rot_dir_var,
value='cw')
self.r_button_ccw = tk.Radiobutton(self, text='ccw', variable=self.rot_dir_var,
value='ccw')
self.label_blade_count = tk.Label(self, text='Count of Main Blades:', anchor='e')
self.blade_count_var = tk.IntVar()
self.entry_blade_count = tk.Entry(self, textvariable=self.blade_count_var,
bg='light yellow', justify='center', width=5)
self.label_blade_count_splitter = tk.Label(self, text='Count of Splitter Blades:', anchor='e')
self.blade_count_splitter_var = tk.IntVar()
self.entry_blade_count_splitter = tk.Entry(self, textvariable=self.blade_count_splitter_var,
bg='light yellow', justify='center', width=5)
def manage_layout(self):
"""..."""
g_padding = {'padx':5, 'pady':5}
g_sticky = 'nswe'
# row 0
self.label_nomenclature.grid(row=0, column=0, sticky=g_sticky, **g_padding)
self.entry_nomenclature.grid(row=0, column=1, sticky=g_sticky, **g_padding)
self.label_wheel_type.grid(row=0, column=2, sticky=g_sticky, **g_padding)
self.entry_wheel_type.grid(row=0, column=3, sticky=g_sticky, **g_padding)
self.label_rot_direction.grid(row=0, column=4, sticky=g_sticky, **g_padding)
self.r_button_cw.grid(row=0, column=5, sticky=g_sticky, **g_padding)
self.r_button_ccw.grid(row=0, column=6, sticky=g_sticky, **g_padding)
self.label_blade_count.grid(row=0, column=7, sticky=g_sticky, **g_padding)
self.entry_blade_count.grid(row=0, column=8, sticky=g_sticky, **g_padding)
self.label_blade_count_splitter.grid(row=0, column=9, sticky=g_sticky, **g_padding)
self.entry_blade_count_splitter.grid(row=0, column=10, sticky=g_sticky, **g_padding)