python - 为什么gtk.Dialog在没有获得焦点时直接消失

标签 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

如果我只按“确定”,对话框就会消失,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

最佳答案

您没有运行主循环。这通常意味着 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+ 通常需要运行主循环。

关于python - 为什么gtk.Dialog在没有获得焦点时直接消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37965242/

相关文章:

python - "R6034 An application has made an attempt to load the C runtime library incorrectly"安装pygtk后

python - 如何将主题应用于 PyGTK 应用程序

Python Django 截断响应

python - 如何从作为 Windows pywin32 服务运行的 flask 和女服务员中干净地退出

c++ - GTK+ 对多个小部件使用一个处理程序

linux - 在 GTK+ 3 中编写 Stack Exchange 聊天应用程序,我应该使用什么来显示消息?

python - 在 pygtk 窗口中放置一个数字时钟

python - 使用 fill(color) 方法时 pygame 崩溃

Python 3 从打印输出创建目录名称

c - 如何在 Windows 上安装 GTK+ 3.0?