我在Tkinter中有一个GUI变得越来越复杂。我想将它分成一些模块,以便于管理。 如果我没有使用面向对象的方法,有没有办法将我的GUI分成模块?
以下是我想转移到单独模块的一些代码的简单示例:
def create_main_nav_buttons(strat_folder_list):
global dynamic_info_nav_items
temp_count = 0
for item in strat_folder_list:
main_nav = tk.Canvas(Nav_Frame_Top, width=175, height=grid_box_size/1.5, highlightthickness=1, bg='slategray1')
main_nav.grid(row = temp_count, column = 1)
main_nav.bind("<Button-1>", lambda event, x=item: create_navigation2(x))
temp_count += 1
dynamic_info_nav_items.append(main_nav)
- 旁注:
我之前使用object oriented approach编写了一个GUI,但这次决定不使用它,因为我没有完全理解它的部分内容,例如:
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
所以当出现问题时,这是一个噩梦,我找不到太多支持。
答案 0 :(得分:0)
使用OO技术是将代码划分为模块的正确方法,但它不是唯一的方法。我认为没有课程就可以做更多的工作,但没有什么能阻止你在没有课程的情况下做你想做的事情。
您需要改变编码方式的主要方法是停止依赖全局变量。这意味着您需要将信息从主程序传递到函数,并且函数需要将信息返回给主程序。
尽管我做了一些小改动,但我已尽量让这个示例中的代码尽可能接近原始代码。
首先,创建一个名为&#34; widgets.py&#34;的文件。具有以下内容:
import tkinter as tk
def create_main_nav_buttons(parent, grid_box_size, items):
temp_count = 0
widgets = []
for item in items:
main_nav = tk.Canvas(parent, width=175, height=grid_box_size/1.5, highlightthickness=1, bg='slategray1')
main_nav.grid(row = temp_count, column = 1)
main_nav.bind("<Button-1>", lambda event, x=item: create_navigation2(x))
temp_count += 1
widgets.append(main_nav)
return widgets
def create_navigation2(x):
print("create_navigation2...", x)
接下来,在名为&#34; main.py&#34;:
的文件中创建主程序import tkinter as tk
from widgets import create_main_nav_buttons
root = tk.Tk()
Nav_Frame_Top = tk.Frame(root)
Nav_Frame_Top.pack(side="top", fill="x")
dynamic_info_nav_items = []
strat_folder_list = ["one", "two", "three"]
grid_box_size=10
widgets = create_main_nav_buttons(Nav_Frame_Top, grid_box_size, strat_folder_list)
dynamic_info_nav_items += widgets
root.mainloop()
请注意,您期望在全局命名空间中的父项和其他项被传递给该函数,然后该函数返回主程序可以使用的值。
实际上,您正在创建函数和主程序之间的契约。合同是&#34;你告诉我构建小部件所需的信息,我将创建小部件并将它们返回给你一个列表&#34;。