You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:39:03