【问题标题】:Using a GTK window and waiting for the response使用 GTK 窗口并等待响应
【发布时间】:2013-05-15 01:23:24
【问题描述】:

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: python dialog window gtk pygtk


    【解决方案1】:

    (老问题,但值得回答)

    虽然 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)。通常我会结合这种技术使用对话框,这样我就不必自己创建按钮。在这种情况下,您可以在对话框(self)上连接到response,而不是连接到clicked 上的clicked 并阅读响应代码以了解您要返回的内容,通常将对象变量设置为响应值并在运行中处理它,例如return None如果你发现用户点击了取消。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 非常感谢。很有帮助。
      猜你喜欢
      • 1970-01-01
      • 2012-07-31
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 2016-05-04
      • 1970-01-01
      相关资源
      最近更新 更多