Skip to main content
 首页 » 编程设计

python之Pygubu 从 UI 文件加载新窗口

2025年04月02日37bjzhanghao

我一直在查看 Pygubu 示例,试图最好地理解如何实现我的目标但没有成功。

我是 python 的新手,几天前才开始使用它。我有许多运行良好的函数并接受一系列变量来执行任务,但现在我想尝试创建一个 GUI 来在启动函数等之前处理输入。

因为我是新手,所以我想试试 Pygubu,特别是因为我使用的是 windows 机器。我查看了他们的示例并了解了如何加载我设计的 MainWindow。

我的主窗口基本上是一个从 Panorama.ui 加载的菜单系统,它有几个按钮,按下这些按钮可以打开其他窗口(“SphericalWindow”、“Gigapixel_Window 和”Settings)。

我玩过回调函数,它在拉起一个消息框时效果很好,但是我卡住了的地方是如何调用其他窗口之一打开。

我在 How do I create child windows with Python tkinter? 看到了一个关于打开子窗口的例子。但我不太确定如何将其转换为从 UI 文件中打开一个框架?

那个例子如何创建顶级窗口,例如转换下面的 tk.Toplevel 是从 UI 文件构建的吗?

t = tk.Toplevel(self) 

感谢您的帮助。

import sys 
import os 
 
try: 
    import tkinter as tk 
    from tkinter import messagebox 
except: 
    import Tkinter as tk 
    import tkMessageBox as messagebox 
 
sys.path.append(os.path.join(os.path.dirname(__file__), '../')) 
 
import pygubu 
 
 
class Myapp: 
    def __init__(self, master): 
        self.builder = builder = pygubu.Builder() 
        fpath = os.path.join(os.path.dirname(__file__),"Panorama.ui") 
        builder.add_from_file(fpath) 
 
        mainwindow = builder.get_object('MainWindow', master) 
 
        builder.connect_callbacks(self) 
 
 
    def on_Gigapixel_Click(self): 
        #Callback to open window here. 
 
if __name__ == '__main__': 
    root = tk.Tk() 
    app = Myapp(root) 
    root.mainloop() 

请您参考如下方法:

虽然这个帖子很旧,但我仍然会回答它,因为我偶然发现它正在寻找我现在已经想出的类似解决方案。

我的 Pygubu 文件如下所示:

对应的代码如下所示:

try: 
    import tkinter as tk  # for python 3 
    from tkinter import messagebox 
except: 
    import Tkinter as tk  # for python 2 
    import tkMessageBox as messagebox 
 
import threading 
import pygubu 
 
class Application: 
 
    def __init__(self, master): 
 
        self.builder = builder = pygubu.Builder() 
 
        builder.add_from_file('Panorama.ui') 
 
        self.mainwindow = builder.get_object('MainWindow', master) 
 
        builder.connect_callbacks(self) 
 
    def openSphericalWindow(self): 
 
        builder2 = pygubu.Builder() 
        builder2.add_from_file('Panorama.ui') 
        top2 = tk.Toplevel(self.mainwindow) 
        frame2 = builder2.get_object('SphericalWindow', top2) 
        builder2.connect_callbacks(self) 
 
 
    def quit(self, event=None): 
        self.mainwindow.quit() 
 
    def run(self): 
        self.mainwindow.mainloop() 
 
def startUI(): 
 
    root = tk.Tk() 
    app = Application(root) 
    root.mainloop() 
 
    return 
 
if __name__ == '__main__': 
 
    t = threading.Thread(target=startUI) 
    t.start() 

这会打开一个带有三个按钮的设置窗口,其中的 SphericalWindow-Button 会打开一个新窗口。

希望这对将来的人有帮助!

干杯, 蒂姆