Skip to main content
 首页 » 编程设计

python之使用 GTK 窗口并等待响应

2025年05月04日18artech

我在另一个应用程序中使用 PyGTK 来获取用户输入。我正在构建一个有很多检查按钮的窗口,根据响应我需要继续。

问题是在python中调用window的函数及其运行时,程序没有等待window的响应?如何让它能够等待窗口的响应??

我也不知道我是否可以使用对话框而不是窗口,因为我尝试向对话框添加检查按钮但效果不佳。如果使用窗口不合适,那么有人可以帮助我进行对话吗?

感谢您的帮助。

请您参考如下方法:

(老问题,但值得回答)

虽然 pmoleri 给出了一个可接受的答案(这是我最初处理这种情况的方式),但我发现添加回调有点令人沮丧,因为它混淆了程序流程。有一个像 gtk.Dialog 一样的窗口是很好的,你可以在其中调用 window.run() 并且它会阻塞在那里直到你得到响应,但是 GUI 仍然会运行。您可以使用 gtk.main() 自己完成此功能:

import gtk 
class BlockingWindow(gtk.Window): 
    def __init__(self,checkmark_values): 
        gtk.Window.__init__(self) 
        self.checkmarks = {} 
        # Create check marks here, put them in a dictionary 
        # relating their name to their widget 
        # Also create ok button 
        ok_button.connect("clicked",self.on_ok_button_clicked) 
 
    def on_ok_button_clicked(self,button): 
        gtk.main_quit() 
 
    def run(self): 
        self.show_all() 
        gtk.main() 
        self.destroy() 
        return dict((x,self.checkmarks[x].get_active()) for x in self.checkmarks) 
 
blocking_window = BlockingWindow(["option1","option2"]) 
values = blocking_window.run() 
print "option1 is {}".format(values["option1"]) 
print "option2 is {}".format(values["option2"]) 

gtk.main 可以嵌套,所以这个模式甚至可以在另一个 GUI 窗口内工作,例如从你的主窗口做同样的事情(显然“运行”这个名字并不特别,你可能想把它重命名为更相关的东西,比如“get_values”之类的)。

至于使用对话框,您也可以这样做,要将小部件添加到对话框窗口,您可以引用对话框的“vbox”属性,即self.vbox.pack_start(my_checkbox)。通常我会将对话框与此技术结合使用,这样我就不必自己创建按钮。在这种情况下,不是连接到 ok_button 上的 clicked,而是连接到对话框上的 response (self ) 并阅读响应代码以了解您想要返回的内容,通常将对象变量设置为响应值并在运行时处理它,例如如果您发现用户点击了取消,返回 None。

编辑:我还应该提到,这不仅适用于其他窗口,而且适用于您想要阻止代码但不卡住 GUI 的任何操作。例如,我将此模式与 gobject.timeout_add 结合使用来制作表示 git 克隆的进度条的动画。使用它,我能够创建一个函数,该函数将使用单个 for 循环克隆 n 存储库,而不是将它们与回调一起串起来。这是一个非常强大的模式,真的。