如何将Tkinter GUI应用源代码拆分为多文件并解决Toplevel未定义报错
问题原因
- 直接报错
Toplevel is not defined的核心原因:functions.py模块没有导入Tkinter相关依赖,主文件里的from tkinter import *导入的作用域仅局限在主文件,不会共享到其他导入的模块中。 - 还存在隐藏报错问题:
add_download函数中用到了主文件里的全局变量root和DOWNLOAD_ENTRIES,跨模块无法直接访问另一个模块的全局变量,修复第一个报错后还会触发这两个变量未定义的错误。
解决步骤
1. 改写functions.py代码
首先在顶部导入Tkinter依赖,同时修改add_download函数,将需要用到的主文件变量改为参数传入:
from tkinter import Toplevel, StringVar, Label, Entry, Frame, Button def add_download(root, download_list): # Defining The Pop-up frame: top = Toplevel(root, width = 420, height = 150) top.title("New Download") # Putting on widgets: link = StringVar() LINK_LABEL = Label(top, text = "Paste Link:") FIELD_ENTRY = Entry(top, width = 40, textvariable=link) def on_click(): link_to_verify = (link.get()).strip() if len(link_to_verify)>15: if link_to_verify[0:11]=="http://www.": download_list.insert(0, link_to_verify) else: print("Stupid") else: print("not a valid link") BUTTONS_WIDGET = Frame(top) ADD_BUTTON = Button(BUTTONS_WIDGET, text = "Add", width=10, command=on_click) CANCEL_BUTTON = Button(BUTTONS_WIDGET, text = "Cancel", width=10, command=top.destroy) # Positionning everythig: LINK_LABEL.grid(column=0,row=0) FIELD_ENTRY.grid(column=1,row=0) BUTTONS_WIDGET.grid(column=1,row=2) ADD_BUTTON.grid(column=0,row=0) CANCEL_BUTTON.grid(column=1,row=0)
2. 修改主文件中按钮绑定的回调函数
因为现在add_download需要传入参数,用lambda将参数包起来传入即可,找到主文件中ADD_BUTTON的定义行,修改为:
ADD_BUTTON = Button(root, text="ADD", bd=4, height=2, width=5, command=lambda: add_download(root, DOWNLOAD_ENTRIES))
修改完成后重新运行即可正常弹出添加下载的弹窗。
内容的提问来源于stack exchange,提问作者FozenOption
相关产品推荐
相关产品推荐

