我正在寻找一种解决方案,以便在收到响应后立即隐藏 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/