【问题标题】:Gtk filechooser example in Python hangs on DebianPython 中的 Gtk 文件选择器示例在 Debian 上挂起
【发布时间】:2014-09-30 16:03:52
【问题描述】:

我是 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。

提前致谢!

【问题讨论】:

    标签: python file gtk pygtk filechooser


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多