我使用tkinter创建了几个GUI。但现在我有兴趣将它们组合成一个调用者GUI。因此调用者GUI将具有按钮,当单击时,将打开其他GUI。但是,我无法让它发挥作用。我已正确完成导入(我认为),编辑了subGUI中的主要功能,并在我的按钮中添加了command = GUI.main。我得到它加载但我得到关于丢失文件的错误...但是当我自己运行GUI时它工作正常。
在我的研究中,我读到Tkinter程序中只能有一个主循环。基本上,我不能使用Tkinter GUI来调用另一个Tkinter GUI。你知道我可以做些什么不同,例如,我可以使用wxPython创建调用者GUI并让它调用所有其他使用Tkinter的GUI吗?
谢谢!
答案 0 :(得分:1)
您无法“调用”其他GUI。如果这个其他GUI创建了自己的根窗口并调用mainloop()
,那么您唯一合理的选择就是生成一个新进程。这是一个简单的解决方案,只需要很少的工作。两个GUI将完全相互独立。
如果您可以控制两个GUI中的代码并且希望它们一起工作,那么可以将GUI的基类设置为框架而不是根窗口,然后您可以根据需要创建任意数量的窗口尽可能多的GUI。
例如,让我们从一个简单的GUI开始。复制以下内容并将其放在名为GUI1.py的文件中:
import tkinter as tk
class GUI(tk.Frame):
def __init__(self, window):
tk.Frame.__init__(self)
label = tk.Label(self, text="Hello from %s" % __file__)
label.pack(padx=20, pady=20)
if __name__ == "__main__":
root = tk.Tk()
gui = GUI(root)
gui.pack(fill="both", expand=True)
tk.mainloop()
您可以使用python GUI1.py
等方式正常运行该GUI。
现在,制作该文件的精确副本并将其命名为GUI2.py.您也可以采用相同的方式运行它:python GUI2.py
如果你想制作一个同时包含这两个程序的程序,你可以创建一个如下所示的第三个文件:
import tkinter as tk
import GUI1
import GUI2
# the first gui owns the root window
win1 = tk.Tk()
gui1 = GUI1.GUI(win1)
gui1.pack(fill="both", expand=True)
# the second GUI is in a Toplevel
win2 = tk.Toplevel(win1)
gui2 = GUI2.GUI(win2)
gui2.pack(fill="both", expand=True)
tk.mainloop()
根据您的操作系统和窗口管理器的不同,一个窗口可能正好位于另一个窗口的顶部,因此您可能需要将其移动以查看两者。
答案 1 :(得分:0)
谢谢你的想法。首先,您的代码不会在顶层窗口上打印文本。所以我编辑了一下它就有效了!谢谢。 GUI1和GUI2看起来像:
import tkinter as tk
def GUI1(Frame):
label = tk.Label(Frame, text="Hello from %s" % __file__)
label.pack(padx=20, pady=20)
return
if __name__ == "__main__":
root = tk.Tk()
GUI1(root)
root.mainloop()
然后调用者看起来像这样:
from tkinter import *
import GUI1
import GUI2
def call_GUI1():
win1 = Toplevel(root)
GUI1.GUI1(win1)
return
def call_GUI2():
win2 = Toplevel(root)
GUI2.GUI2(win2)
return
# the first gui owns the root window
if __name__ == "__main__":
root = Tk()
root.title('Caller GUI')
root.minsize(720, 600)
button_1 = Button(root, text='Call GUI1', width='20', height='20', command=call_GUI1)
button_1.pack()
button_2 = Button(root, text='Call GUI2', width='20', height='20', command=call_GUI2)
button_2.pack()
root.mainloop()