将Tkinter GUI分离为单独的模块(Python 3.4)

将Tkinter GUI分离为单独的模块(Python 3.4),python,python-3.x,user-interface,tkinter,Python,Python 3.x,User Interface,Tkinter,我在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

我在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)

因此,当出现问题时,修复是一场噩梦,我找不到太多支持。

使用OO技术是将代码划分为模块的正确方法,但这不是唯一的方法。我认为不用课做这件事需要更多的工作,但是没有什么可以阻止你不用课做你想做的事情

关于编码方式,您需要改变的主要事情是停止依赖全局变量。这意味着您需要将信息从主程序传递到函数,函数需要将信息返回到主程序

例子 我试图使本例中的代码尽可能接近您的原始代码,尽管我做了一些小的更改

首先,创建一个名为“widgets.py”的文件,其中包含以下内容:

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)
请注意,父项和您希望位于全局命名空间中的其他项被传递到该函数,然后该函数返回主程序可以使用的值


本质上,您是在函数和主程序之间创建契约。合同是“你告诉我构造小部件所需的信息,我将创建小部件并在列表中返回给你”。

(使用这种方法,全局变量和导入也将是一场噩梦)。i、 e.在示例代码中,您需要导入
create_navigation2
Nav_Frame_Top
tooI用tkinter编写了一个600行的GUI,使用函数和变量,它工作得很好,但我最终还是将其移动到了一个类中,这样我就可以避免使用全局变量。您可能只想对类使用OOP方法,这样就可以使用类属性来避免全局性。您不明白的
\uuuu init\uuuu
语句是什么?如果你阅读了关于它的文档,就不难理解了。不仅仅如此。它是如何访问不同的功能。例如,我有一个按钮,我希望它在单击时激活一个功能。它不起作用,因为:AttributeError:object没有属性“parent”,我不知道WTF是错误的。通过反复试验,我有时会使用self.parent.main使其正常工作。或self.main或self。。但是我会遇到另一个对我来说毫无意义的问题。当我想发布一个问题的简化版本时,我不知道该删除什么和包含什么。这太糟糕了,我真的很想使用类,但idk知道当事情变糟时如何获得帮助。对不起,在这里无法向您发送私人消息,也找不到您的联系人。我得感谢你对tkinter的帮助。你所有的帖子都是无价的。一年多前我学会了编程,在你的帮助下,我做了一个非常有用的应用程序。我知道我有很多东西要学,你的所有帖子都在慢慢地把我推向正确的方向。谢谢
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)
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()