繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM