使用Python,如何从另一个GUI调用tkinter GUI?

时间:2018-02-15 23:08:50

标签: python user-interface tkinter wxpython

我使用tkinter创建了几个GUI。但现在我有兴趣将它们组合成一个调用者GUI。因此调用者GUI将具有按钮,当单击时,将打开其他GUI。但是,我无法让它发挥作用。我已正确完成导入(我认为),编辑了subGUI中的主要功能,并在我的按钮中添加了command = GUI.main。我得到它加载但我得到关于丢失文件的错误...但是当我自己运行GUI时它工作正常。

在我的研究中,我读到Tkinter程序中只能有一个主循环。基本上,我不能使用Tkinter GUI来调用另一个Tkinter GUI。你知道我可以做些什么不同,例如,我可以使用wxPython创建调用者GUI并让它调用所有其他使用Tkinter的GUI吗?

谢谢!

2 个答案:

答案 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()