2013-04-24 81 views
0

我遇到問題python GTK:應用程序正在關閉的信息對話框

我的關閉應用程序必須從Web應用程序註銷。這需要一些時間。我想用「退出」信息

class Belt(gtk.Window): 

def __init__(self): 
    super(Belt, self).__init__() 
    self.connect("destroy", self.destroy) 

def destroy(self, widget, data=None): 
    if self.isLogged: 
     md = gtk.MessageDialog(None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, ico, gtk.BUTTONS_NONE, txt) 
     md.showall() 
     self.send('users/logout.json', {}, False, False) 
    gtk.main_quit() 

def main(self): 
    if self.iniError is False: 
     gtk.gdk.threads_init() 
     gtk.gdk.threads_enter() 
     gtk.main() 
     gtk.gdk.threads_leave() 


if __name__ == "__main__": 
    app = Belt() 
    app.main() 

告知用戶它當我試圖表明在銷燬方法只窗口不會出現對話框,沒有圖標和文本。 我想,這個對話框沒有確認按鈕,只有信息和對話框必須與所有的應用程序銷燬。

任何想法?

對不起,我的英文不好

回答

0

基本上,GTK必須有通過事件隊列中工作的所有時間的機會。如果其他處理需要很長時間,並且事件隊列在此期間未處理,則您的應用程序將無響應。這通常不是你想要的,因爲它可能導致你的窗口不被更新,保持灰色,具有奇怪的人爲因素或其他可見的毛刺。它甚至可能會導致你的窗口系統灰色窗口,並提供殺死大概凍結的應用程序。

解決方法是確保正在處理事件隊列。有兩種主要方法可以做到這一點。如果需要長時間的部分由許多漸進的步驟,您可以定期自行處理隊列:

def this_takes_really_long(): 
    for _ in range(10000): 
     do_some_more_work() 
     while gtk.events_pending(): 
      gtk.main_iteration() 

在一般情況下,你必須訴諸於某種異步處理的。典型的方法是將阻塞部件放入其自己的線程中,然後通過空閒回調信號發回主線程(位於主循環中)。在你的代碼中,它可能看起來像這樣:

from threading import Thread 

import gtk, gobject 

class Belt(gtk.Window): 

    def __init__(self): 
     super(Belt, self).__init__() 
     self.connect("destroy", self.destroy) 

     self.show_all() 

     self.isLogged = True 
     self.iniError = False 


    def destroy(self, widget, data=None): 
     if self.isLogged: 
      md = gtk.MessageDialog(None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, 0, gtk.BUTTONS_NONE, "Text") 
      md.show_all() 
      Thread(target=self._this_takes_very_long).start() 


    def main(self): 
     if self.iniError is False: 
      gtk.gdk.threads_init() 
      gtk.gdk.threads_enter() 
      gtk.main() 
      gtk.gdk.threads_leave() 


    def _this_takes_very_long(self): 
     self.send('users/logout.json', {}, False, False) 
     gobject.idle_add(gtk.main_quit) 


if __name__ == "__main__": 
    app = Belt() 
    app.main() 
相關問題