我正在设计一个小型 GUI 来与我编写的一段代码进行交互。
我的问题是 Gtk.main()
命令似乎被阻塞了,即使当我点击 destroy 按钮时我的窗口关闭了,我的终端仍然挂起。
我也没有看到与信号的任何交互。
这是我的示例:
#!/usr/bin/env python
from gi.repository import Gtk, Gdk, GObject
GObject.threads_init()
class Ivolution():
def __init__(self):
print "in"
self.builder = Gtk.Builder()
self.builder.add_from_file("data/ui/IvolutionWindow.glade")
#builder.connect_signals({ "on_window_destroy" : gtk.main_quit })
self.window = self.builder.get_object("ivolution_window")
print "in fin"
def on_stopbutton_clicked(self, widget):
"""
Asks the Facemovie thread to terminate
"""
print "Stop"
def on_ivolutionwindow_destroy(self, widget, data=None):
"""Called when the IvolutionWindow is closed."""
# Clean up code for saving application state should be added here.
print "Exiting"
Gtk.main_quit()
print "Exited"
if __name__ == "__main__":
app = Ivolution()
print "deb"
app.window.show()
Gdk.threads_init()
Gdk.threads_enter()
print "but"
Gtk.main()
print "end"
Gdk.thread_leave()
print "ding"
我删除了所有非必要部分。
Gobject 和 gdk.threads 是我在互联网上查看不同源代码时所做的测试。
我想不出它们的成功组合。
如果我在控制台中运行该程序,这就是我得到的:
in
(Ivolution.py:4635): Gtk-CRITICAL **: gtk_radio_button_set_group: assertion `!g_slist_find (group, radio_button)' failed
(Ivolution.py:4635): Gtk-CRITICAL **: gtk_radio_button_set_group: assertion `!g_slist_find (group, radio_button)' failed
in fin
deb
but
即使我按下了停止按钮并关闭了窗口。
关闭窗口后,控制台保持不变,即使按 ctrl+c 也不会停止应用程序。
我确定我错过了一些基本的东西,但作为一个完整的 GUI 菜鸟,我没有看到什么。 This sample code看起来真的很接近我。有什么想法吗?
最佳答案
好吧,我在这里同时感到愤怒和愚蠢。
我尝试重用我用 Quickly 所做的尝试中的代码
我的 glade 文件中没有定义任何信号。 出于某种原因,我不完全明白,Quickly 允许您调用事件而无需在 glade 文件中定义它们。
肯定不行。
只要您在 glade 文件中定义了正确的信号,上面的 Python 代码就可以正常工作
编辑:
作为信息的补充,这里是信号在 glade 文件中的样子
<signal name="delete-event" handler="on_destroy" swapped="no"/>
关于python - Gtk3 接口(interface)中的 Gtk.main() 阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11535748/