使用GTK窗口并等待响应

WiD*_*ata 1 python gtk pygtk dialog window

我在另一个应用程序中使用PyGTK接受用户输入。我正在构建一个包含很多“检查按钮”的窗口,根据响应,我需要继续。

问题是在python中,当我调用window函数及其操作时,程序是否不等待window的响应?如何使它能够等待来自窗口的响应?

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

谢谢你的帮助。

Jos*_*iah 6

(较老的问题,但值得回答)

尽管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"])
Run Code Online (Sandbox Code Playgroud)

gtk.main可以嵌套,因此即使在另一个GUI窗口中也可以使用此模式,例如,在主窗口中执行相同的操作(显然,名称“ run”并不特殊,您可能希望将其重命名为更相关的名称,例如“ get_values”之类的东西。

至于使用对话框,也可以这样做,将小部件添加到对话框窗口中,可以引用对话框的“ vbox”属性,即self.vbox.pack_start(my_checkbox)。通常,我将对话框与该技术结合使用,因此不必自己创建按钮。在这种情况下,而不是连接到clickedok_button,您可以连接到response该对话框上(self)和读取响应代码,知道你要回来,一般设置一个对象变量的响应值和运行处理回,例如:What return None如果您发现用户单击了取消。

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