2011-05-15 159 views
7

如果你在GTK中有一個子窗口,並且你想按程序關閉它(例如,按下保存按鈕或退出鍵),是否有關閉窗口的首選方法?編程關閉gtk窗口

例如,

window.destroy() 
# versus 
window.emit('delete-event') 

回答

7

刪除在PyGTK的一個窗口時,您應該使用window.destroy()(或與此有關的任何部件的)。當您致電window.destroy()時,窗口將自動發出delete-event事件。此外,使用PyGTK發送事件的信號時,幾乎總是需要將事件對象傳遞給emit方法(請參閱pyGObject documentation for the emit method)。當嘗試將gtk.gdk.Event(gtk.EVENT_DELETE)傳遞給對象的delete-event的emit方法時,它將不起作用。 E.g:

Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import gtk 
>>> w = gtk.Window() 
>>> w.show() 
>>> w.emit("delete-event", gtk.gdk.Event(gtk.gdk.DELETE)) 
False 

也許最好的辦法,雖然是簡單地使用del聲明,會自動刪除窗口/小工具,爲你做任何必要的清理。這樣做比調用window.destroy()更「pythonic」,它將圍繞對被銷燬窗口的引用留下。

13

使用銷燬方法不能按預期工作,因爲'delete-event'回調沒有在銷燬的窗口上調用,因此編輯器例如將不會有機會詢問用戶文件必須保存。

[3|[email protected]|~]python 
Python 2.7.3 (default, Jul 24 2012, 10:05:38) 
[GCC 4.7.0 20120507 (Red Hat 4.7.0-5)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import gtk 
>>> w = gtk.Window() 
>>> w.show() 
>>> def cb(w,e): 
... print "cb", w, e 
... return True 
... 
>>> w.connect ('delete-event', cb) 
>>> w.destroy() 

在上面的例子中調用w.destroy()將不會調用回調,而在「關閉」按鈕,點擊會調用它(窗口不會關閉,因爲回調返回TRUE)。

因此,你必須既發射信號,然後破壞小工具,如果信號處理函數返回false,e.g:

if not w.emit("delete-event", gtk.gdk.Event(gtk.gdk.DELETE)): 
    w.destroy()