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

时间:2014-09-30 16:03:53

标签: python file gtk pygtk filechooser

我是GTK的新手。我一直在寻找我的问题的答案,但我没有找到任何东西。问题是我想使用GTK FileChooser来选择文件。我一直在看这里可用的例子:

http://pygtk.org/pygtk2tutorial/examples/filechooser.py

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

所以我回到了这个例子,等了一会儿,看看窗户是否被毁坏了。事实上,它没有。选择文件的窗口仅在程序完成时消失。这是代码:

#!/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秒钟,窗口也不会消失,直到程序结束。我需要知道示例中是否有错误或我做错了什么,因为这不是我希望在我的程序中发生的事情。

以防万一,我使用的是Python 2.7.3和Debian 7.

提前致谢!

1 个答案:

答案 0 :(得分:0)

你不能在没有主循环的情况下使用GTK +:现在代码工作的唯一原因是dialog.run()恰好在该调用期间运行自己的内部主循环。之后没有mainloop来处理诸如调用窗口的destroy处理程序之类的事情。

初始化应用后,运行gtk.main()而不显示对话框。然后从适当的信号处理程序调用{​​{1}}和相关代码 - 出于测试目的,您可以在调用main之前添加dialog.run():这样在主循环开始运行后立即调用处理程序。