我正在设计一个小GUI来与我编写的一段代码进行交互。
我的问题是Gtk.main()
命令似乎阻塞了,即使我点击销毁按钮时我的窗口关闭,我的终端仍然被挂起。
我也没有看到任何与信号的互动。
这是我的样本:
#!/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似乎非常接近我的。有什么想法吗?
答案 0 :(得分:1)
好的,我在这里同时感到生气和傻瓜。
我尝试重复使用Quickly
尝试的代码我的glade文件中没有定义信号。 出于某种原因,我并没有完全得到,Quickly让你调用事件而不在glade文件中定义它们。
确定无法正常工作。上面的Python代码可以正常工作,前提是您在glade文件中定义了正确的信号
编辑:
作为信息的补充,这里是一个信号在林间空地文件中的样子
<signal name="delete-event" handler="on_destroy" swapped="no"/>