2013-04-24 107 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() 
相关问题