Python3 Tkinter - 用按钮打开.py文件

1 投票
1 回答
4169 浏览
提问于 2025-04-18 16:20

我有多个用 .py 写的 tkinter 界面,想把它们合并在一起。最开始我并没有打算把它们合成一个界面,所以有很多变量是共享的,还有一些全局命令,这让把每个窗口放到一个函数里变得很困难,想在一个 .py 文件里合并它们。于是我在想,能不能让按钮打开这些应用程序,这样就能分别运行它们。我有一个菜单和一些按钮,这样是可以的,但问题是,如果我关闭了一个窗口再回到菜单,我就不能“重新导入”一个 .py 文件,所以不能打开一个新窗口,关闭它后再回到菜单。下面是我的代码:

def newWindow():
    root.destroy()
    import newFile

button1 = tk.Button(root, command=newWindow)
button1.pack()

为了更清楚地说明问题:假设我一开始在菜单上。我点击一个按钮关闭菜单,打开一个新的窗口,里面是一个单独的程序。我关闭那个程序后,菜单会自动重新打开。但是,现在当我从菜单再次打开这个程序时,菜单虽然关闭了,但程序却不会重新打开,因为它已经被导入过了。

1 个回答

1

好的,@drsom,这样做应该可以。在你使用 import py1 的地方,应该改成 from py1 import func1,然后在下一行写 func1()(显然,这意味着你需要像我下面做的那样创建 func1func2)。出于某种原因,这样做可以让你一直运行下去,我不知道为什么单纯的导入不行。此外,你还必须在函数后面加上 if __name__ == '__main__':,然后在下一行写 func2(),这样第一次运行这个函数时就能开始循环。

一个简单的例子:

py1:

def func1():
    import tkinter as tk

    root1 = tk.Tk()

    def kill1():
        root1.destroy()
        from py2 import func2
        func2()

    button1 = tk.Button(root1, bg = 'green', text = 'hit to kill py1 and start py2', command = kill1)
    button1.pack()

    root1.mainloop()

if __name__ == '__main__':
    func1()

py2:

def func2():
    import tkinter as tk

    root2 = tk.Tk()

    def kill2():
        root2.destroy()
        from py1 import func1
        func1()

    button2 = tk.Button(root2, bg = 'red', text = 'hit to kill py2 and start py1', command = kill2)
    button2.pack()

    root2.mainloop()

if __name__ == '__main__':
    func2()

这样应该可以,但如果代码需要在原始函数之后继续运行,可能会出现一些问题。我不太确定你还想要什么,但随时问我 :),希望这对你有帮助。

撰写回答