0

我有个问题

我关闭的应用程序必须从 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()

当我尝试在销毁方法中显示对话框时,只会出现窗口,没有图标和文本。我想,这个对话框没有确认按钮,只有信息,并且对话框必须与所有应用程序一起销毁。

有任何想法吗?

对不起我的英语不好

4

1 回答 1

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()
于 2013-04-26T14:31:14.940 回答