[英]Python Tkinter GUI Frame: How to call a class method from inside a function of another class?
[英]Using Python, how do you call a tkinter GUI from another GUI?
我使用 tkinter 创建了几个 GUI。 但现在我有兴趣将它们组合成一个调用者 GUI。 因此,调用方 GUI 将具有按钮,单击这些按钮时会打开其他 GUI。 但是,我无法让它工作。 我已经正确地完成了导入(我认为),编辑了 subGUI 中的主要功能,并在我的按钮中添加了 command=GUI.main。 我让它加载,但我收到有关丢失文件的错误......但是当我自己运行 GUI 时,它工作正常。
在我的研究中,我读到 Tkinter 程序中只能有一个主循环。 基本上,我不能使用 Tkinter GUI 来调用另一个 Tkinter GUI。 你知道我可以做些什么不同的,例如,我可以使用 wxPython 创建调用者 GUI 并让它调用所有其他使用 Tkinter 的 GUI 吗?
谢谢!
您不能“调用”另一个 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()
根据您的操作系统和窗口管理器,一个窗口可能位于另一个窗口的正上方,因此您可能需要移动它才能看到两个窗口。
谢谢你的想法。 起初,您的代码不会在顶层窗口上打印文本。 所以我编辑了一点,它奏效了! 谢谢。 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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.