使用GTK窗口并等待响应

时间:2013-05-20 13:10:16

标签: python dialog window gtk pygtk

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

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

我也不知道我是否可以使用对话框而不是窗口,因为我尝试在对话框中添加检查按钮,但效果不佳。如果使用窗口不合适,任何人都可以通过对话帮助我吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

(陈旧的问题,但值得回答)

虽然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窗口内工作,例如从你的主窗口做同样的事情(显然名称“run”并不特别,你可能想要将它重命名为更相关的东西,比如“get_values”或其他东西)。

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

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

答案 1 :(得分:0)

在这个答案中,您有一个使用回调函数的示例: How can I pass variables between two classes/windows in PyGtk?

确认被调用窗口后,执行调用者窗口/对象的回调函数。