python GTK:带有应用程序正在关闭的信息的对话框

时间:2013-04-24 12:20:26

标签: python pygtk

我遇到了问题

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

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

有什么想法吗?

抱歉我的英语不好

1 个答案:

答案 0 :(得分: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()