pygtk中的connect()和connect_after()之间的区别

问题描述:

我不知道pygtk中的connect()connect_after()之间有什么区别。有人可以用示例代码来解释这一点。pygtk中的connect()和connect_after()之间的区别

谢谢。

首先,这里是定义g_signal_connect_after

连接一个GCallback功能为特定object.The 处理的信号将被称为信号的默认处理程序之后。

但什么是默认的处理你可能会问,好了,GSignal description这是非常descritive:

信号系统的基本概念是 信号的发射。信号按每种类型引入,并通过 字符串进行标识。为父类型引入的信号也可以在派生的 类型中使用,所以基本上它们是继承的 的每类型设施。

信号发射主要涉及以精确定义的方式调用某一组回调函数。这种回调有两个主要类别 ,每个对象和用户提供的。 (虽然 信号可以处理任何类型的可实例化类型,但我将 指向以下类型的“对象类型”,只是因为大多数用户将遇到信号的情景是 。)每个对象 回调通常被称为“对象方法处理程序”或 “默认(信号)处理程序”,而用户提供的回调通常是 ,只是称为“信号处理程序”。

的对象的方法的处理程序是在信号创建时提供(这 最常发生在一个对象类的创建结束), 而用户提供处理程序频繁地连接和断开 向/从对某些特定信号对象实例。

一种信号发射包括五个阶段,除非提前停止:

  • 调用用于G_SIGNAL_RUN_FIRST信号对象方法处理程序

  • 调用正常的用户提供的信号处理程序(其中标记后的未设置)

  • 调用G_SIGNAL_RUN_LAST信号的对象方法处理函数

  • 用户提供的信号处理程序(其中后标志被设置)

  • 为G_SIGNAL_RUN_CLEANUP信号

用户提供的信号处理程序的对象的方法的处理程序的调用的3210

  • 调用被调用的顺序他们被连接上了。

  • 现在你知道了信号序列,接下来是answer to a similar question但GTK的邮件列表:

    g_signal_connect_after会让你运行 类的默认处理程序后,用户处理程序;为什么这是有用的?

    说我有发出的“初始化”,其中的 类处理程序不工作,你可能希望你的处理器的类处理程序之后运行 ,这样就可以使用信号的对象已经初始化 对象的功能。

    我认为你通常不需要使用这种方法,因为 的信号通常是用G_SIGNAL_RUN_FIRST来安装的;如果 我没有弄错意味着它的默认处理程序将在 用户处理程序之前调用。

    更高层次的语言使用它可能没有明显的需求,但是,例如,可以说要保证一个回调将是最后一个用户回调运行,那么你可以使用这个方法。 (注意不推荐使用pygtk,使用pygobject)。

    ,我们连接两个方法,on_click2on_click1(按这个顺序)一个简单的例子,通过使用connect_afteron_click2我们要确保它会运行最后一个(用户回调):

    import gi 
    gi.require_version("Gtk", "3.0") 
    from gi.repository import Gtk 
    
    class Button(Gtk.Box): 
    
        def __init__(self, message): 
         Gtk.Box.__init__(self, spacing=6) 
         self.set_border_width(10) 
         button = Gtk.Button.new_with_label(message) 
         self.pack_start(button, True, True, 0) 
         button.connect_after("clicked", self.on_click2) 
         button.connect("clicked", self.on_click1) 
    
        def on_click1(self, widget): 
         print ("Click1 signal. connect normal"); 
    
        def on_click2(self, widget): 
         print ("Click2 signal. connect after"); 
    
    win = Gtk.Window() 
    button = Button("Test") 
    
    win.add (button) 
    
    win.connect("destroy", Gtk.main_quit) 
    win.show_all() 
    
    Gtk.main() 
    

    而结果是on_click2是最后的,尽管它是第一个连接的事实被称为:

    $ python <filename.py> 
    ... (Click test button)... 
    Click1 signal. connect normal 
    Click2 signal. connect after 
    

    enter image description here