0

我正在设计一个小型 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 菜鸟,我看不到什么。这个示例代码看起来非常接近我的。任何的想法?

4

1 回答 1

1

好吧,我在这里既生气又傻。

我尝试重用我使用Quickly所做的尝试中的代码

我的林间空地文件中没有定义任何信号。出于某种原因,我不完全明白,Quickly 允许您调用事件而无需在 glade 文件中定义它们。

确定它不能工作。

上面的 Python 代码可以正常工作,前提是您在 glade 文件中定义了正确的信号

编辑 :

作为信息的补充,下面是信号在 glade 文件中的样子

<signal name="delete-event" handler="on_destroy" swapped="no"/>
于 2012-07-18T11:42:24.980 回答