2013-04-24 1 views
0

문제가 있습니다.python GTK : 응용 프로그램을 닫는 중 정보가 포함 된 대화 상자

내 응용 프로그램을 닫은 후 웹 응용 프로그램에서 로그 아웃해야합니다. 시간이 좀 걸립니다. 내가 방법을 표시 않는 경우에만 창을 파괴에서 대화 상자를 표시 할 때 아이콘과 텍스트없이 정보

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()