Python中的Gtk filechooser示例挂起在Debian上

Python中的Gtk filechooser示例挂起在Debian上,python,file,gtk,pygtk,filechooser,Python,File,Gtk,Pygtk,Filechooser,我是GTK的新手。我一直在寻找我的问题的答案,但我什么也没找到。问题是我想使用GTK FileChooser来选择一个文件。我一直在看下面的例子: 然后,我使用在示例中学习的知识将此功能添加到我的程序中。但是,我注意到,当我选择一个文件时,窗口会挂起。我的意思是,在我关闭整个程序之前,选择文件的窗口永远不会消失 所以我回到这个例子,只是等了一段时间,看看窗户是否被破坏了。事实上,它没有。只有当程序完成时,选择文件的窗口才会消失。代码如下: #!/usr/bin/env python # exam

我是GTK的新手。我一直在寻找我的问题的答案,但我什么也没找到。问题是我想使用GTK FileChooser来选择一个文件。我一直在看下面的例子:

然后,我使用在示例中学习的知识将此功能添加到我的程序中。但是,我注意到,当我选择一个文件时,窗口会挂起。我的意思是,在我关闭整个程序之前,选择文件的窗口永远不会消失

所以我回到这个例子,只是等了一段时间,看看窗户是否被破坏了。事实上,它没有。只有当程序完成时,选择文件的窗口才会消失。代码如下:

#!/usr/bin/env python
# example filechooser.py

import pygtk
pygtk.require('2.0')

import gtk
import time

# Check for new pygtk: this is new class in PyGtk 2.4
if gtk.pygtk_version < (2,3,90):
   print "PyGtk 2.3.90 or later required for this example"
   raise SystemExit

dialog = gtk.FileChooserDialog("Open..",
                               None,
                               gtk.FILE_CHOOSER_ACTION_OPEN,
                               (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                                gtk.STOCK_OPEN, gtk.RESPONSE_OK))
dialog.set_default_response(gtk.RESPONSE_OK)

filter = gtk.FileFilter()
filter.set_name("All files")
filter.add_pattern("*")
dialog.add_filter(filter)

filter = gtk.FileFilter()
filter.set_name("Images")
filter.add_mime_type("image/png")
filter.add_mime_type("image/jpeg")
filter.add_mime_type("image/gif")
filter.add_pattern("*.png")
filter.add_pattern("*.jpg")
filter.add_pattern("*.gif")
filter.add_pattern("*.tif")
filter.add_pattern("*.xpm")
dialog.add_filter(filter)

response = dialog.run()
if response == gtk.RESPONSE_OK:
    print dialog.get_filename(), 'selected'
elif response == gtk.RESPONSE_CANCEL:
    print 'Closed, no files selected'
dialog.destroy()
time.sleep(3)
在这3秒钟里,窗户就在那里,所以我想它从来没有被破坏过,我想知道为什么。即使我等待10秒钟,窗口也不会消失,直到程序完成。我需要知道示例中是否有错误,或者我做错了什么,因为这不是我希望在我的程序中发生的事情

以防万一,我使用的是Python2.7.3和Debian7


提前谢谢

如果没有mainloop,就不能使用GTK+:代码现在可以工作的唯一原因是dialog.run在调用期间运行自己的内部mainloop。之后,没有mainloop来处理诸如调用窗口的destroy处理程序之类的事情

初始化应用程序后,在不显示对话框的情况下运行gtk.main。然后从一个合适的信号处理程序call dialog.run和相关代码-出于测试目的,您可以在调用main之前添加一个glib.idle\u addhandler\u,该处理程序在main循环开始运行后立即被调用