2014-09-30 15 views
0

我是GTK的新手。我一直在尋找我的問題的答案,但我沒有找到任何東西。關鍵是我想用GTK FileChooser來選擇一個文件。我一直期待在這裏提供的例子:Python中的Gtk filechooser示例掛在Debian上

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

提前

謝謝!

回答

0

你不能在沒有主循環的情況下使用GTK +:現在代碼工作的唯一原因是dialog.run()碰巧在該調用期間運行它自己的內部主循環。之後,沒有主循環來處理諸如調用窗口的銷燬處理程序之類的事情。

初始化應用程序後,運行gtk.main()而不顯示對話框。然後從適當的信號處理程序調用dialog.run()和相關的代碼 - 爲了測試目的,您可以在調用main之前添加glib.idle_add(handler_that_runs_dialog):這樣在主循環開始運行後處理程序被調用。