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

时间:2017-07-12 20:08:40

标签: 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 = 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

所以当出现问题时,这是一个噩梦,我找不到太多支持。

1 个答案:

答案 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;。