为什么gtk.Dialog在没有焦点的情况下直接消失

时间:2016-06-22 10:25:06

标签: python gtk pygtk gtk2

我正在寻找一个解决方案,在获得响应后立即隐藏gtk对话框。但现在我想知道为什么它会消失,但前提是我没有点击输入字段:

import gtk, time

def get_info():
    entry = gtk.Entry()
    entry.set_text("Hello")
    dialog = gtk.Dialog(title = "Title",
                       parent = None,
                       flags = gtk.DIALOG_MODAL  | gtk.DIALOG_DESTROY_WITH_PARENT,
                       buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
                        gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
    dialog.vbox.pack_start(entry)
    dialog.show_all()    
    response = dialog.run()
    if response == gtk.RESPONSE_ACCEPT:
        info = entry.get_text().strip()
        dialog.destroy()
        return info
    else:
        exit()

info = get_info()
time.sleep(4)
print info

如果我只是按" OK"对话框消失,4秒后打印信息。 如果我点击输入字段然后按"确定"在程序结束之前,对话框不会消失。 为什么会这样?

修改

如果我使用主循环进行此操作同样的问题:

#!/usr/bin/env python
# -*- coding: utf8 -*-


import gtk, time

class EntryTest:

    def get_info(self):
        entry = gtk.Entry()
        entry.set_text("Hello")
        dialog = gtk.Dialog(title = "Title",
                           parent = None,
                           flags = gtk.DIALOG_MODAL  | gtk.DIALOG_DESTROY_WITH_PARENT,
                           buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
                            gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
        dialog.vbox.pack_start(entry)
        dialog.show_all()    
        response = dialog.run()
        if response == gtk.RESPONSE_ACCEPT:
            info = entry.get_text().strip()
            dialog.destroy()
            return info
        else:
            exit()

    def main(self):
        gtk.main()

if __name__ == "__main__":
    base = EntryTest()
    info = base.get_info()
    time.sleep(4)
    print info

1 个答案:

答案 0 :(得分:2)

您没有正在运行的主循环。这通常意味着Gtk +没有做任何事情 - 窗口首先不会显示 - 但dialog.run()特别之处在于它碰巧运行自己的短寿命主循环所以它看起来很像事情正在发挥作用。在dialog.run()退出后,您确实没有运行主循环,因此Gtk +无法执行任何操作。

如果你在运行gtk.main()的真实应用程序中执行此操作,它应该可以正常工作。

主循环使用示例(EntryTest可以保持不变,但您需要额外的import glib):

def quit ():
    print "now quitting"
    gtk.main_quit()
    return False

if __name__ == "__main__":
    base = EntryTest()
    print base.get_info()
    glib.timeout_add_seconds (3, quit)
    gtk.main()

值得注意的是,当对话框可见时,主循环没有运行,但仅在之后(因为我很懒)。您也可以在主循环中启动get_info()代码,例如glib.idle_add()但重点是:GTK +通常需要主循环才能运行。