Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用GTK窗口并等待响应_Python_Dialog_Window_Gtk_Pygtk - Fatal编程技术网

Python 使用GTK窗口并等待响应

Python 使用GTK窗口并等待响应,python,dialog,window,gtk,pygtk,Python,Dialog,Window,Gtk,Pygtk,我在另一个应用程序中使用PyGTK获取用户输入。我正在建立一个窗口,其中有很多检查按钮,并根据我的反应需要继续 问题是在python中,当我调用window函数及其操作时,程序不会等待window的响应?我如何让它能够等待窗口的响应 我也不知道是否可以使用对话框而不是窗口,因为我尝试在对话框中添加检查按钮,但效果不好。若使用窗口不合适,那个么有人能帮助我使用对话框吗 感谢您的帮助。在这个答案中,您有一个使用回调函数的示例: 确认被调用的窗口后,执行调用方窗口/对象的回调函数。(这是一个老生常谈

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

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

我也不知道是否可以使用对话框而不是窗口,因为我尝试在对话框中添加检查按钮,但效果不好。若使用窗口不合适,那个么有人能帮助我使用对话框吗


感谢您的帮助。

在这个答案中,您有一个使用回调函数的示例:

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

(这是一个老生常谈的问题,但值得回答)

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

可以嵌套gtk.main,因此此模式甚至可以在另一个GUI窗口内工作,例如,从主窗口执行相同的操作(显然,“run”这个名称并不特殊,您可能希望将其重命名为更相关的名称,例如“get_values”或其他名称)

至于使用dialog,您也可以这样做,要向对话框窗口添加小部件,您可以引用对话框的“vbox”属性,即
self.vbox.pack\u start(my\u复选框)
。通常我会结合使用一个对话框,这样我就不必自己创建按钮了。在这种情况下,您可以连接到对话框(
self
)上的
response
,读取响应代码以了解您想要返回的内容,而不是连接到
确定按钮上单击的
,通常将对象变量设置为响应值并在运行时重新处理,例如,
如果发现用户单击了取消,则返回None


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

非常感谢。非常有用。
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"])