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

时间:2017-08-26 21:17:12

标签: gtk pygtk

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

感谢。

1 个答案:

答案 0 :(得分:2)

首先,这是g_signal_connect_after的定义:

  

将GCallback函数连接到特定对象的信号   处理程序将在信号的默认处理程序之后被称为

但是你可能会问的默认处理程序是什么,GSignal description它非常具有欺骗性:

  

信号系统的基本概念是a的发射   信号。信号是按类型引入的,并通过识别   字符串。为父类型引入的信号可在派生中获得   类型也是如此,所以基本上它们是一种类型的设施   继承的。

     

信号发射主要涉及某一组的调用   以精确定义的方式回调。主要有两类   这些回调,每个对象和用户提供的回调。 (虽然   信号可以处理任何类型的可实例化类型,我指的是   那些类型为"对象类型"在下面,仅仅因为那个   是大多数用户将遇到信号的上下文。)每个对象   回调通常被称为"对象方法处理程序"要么   "默认(信号)处理程序",而用户提供的回调通常是   刚刚调用了#34;信号处理程序"。

     

在信号创建时提供对象方法处理程序(这个   最经常发生在一个对象类的末尾'创建),   而用户提供的处理程序经常连接和断开连接   来自某些对象实例上的某个信号。

     

信号发射包括五个阶段,除非过早停止:

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

  •   
  • 调用普通用户提供的信号处理程序(未设置after标志)

  •   
  • 调用G_SIGNAL_RUN_LAST信号的对象方法处理程序

  •   
  • 调用用户提供的信号处理程序(设置了after标志)

  •   
  • 调用G_SIGNAL_RUN_CLEANUP信号的对象方法处理程序

  •   
     

用户提供的信号处理程序按其连接顺序调用。

现在您知道了信号序列,接下来是answer to a similar question,但是在Gtk邮件列表上:

  

g_signal_connect_after将允许您在运行后运行用户处理程序   class的默认处理程序;为什么这很有用?

     

假设我有一个对象发出"初始化"它的信号   类处理程序完成工作,您可能希望您的处理程序运行   在类处理程序之后,您可以使用已经初始化的   你职能中的对象。

     

我认为通常你不必使用这种方法因为信号   那种性质通常与G_SIGNAL_RUN_FIRST一起安装;如果   我没弄错,意味着之前会调用它的默认处理程序   用户处理程序无论如何。

在更高级别的语言中使用它可能没有明显的需求,但是,例如,假设您要保证回调将是最后一次运行的用户回调,那么您可以使用此方法。 (注意pygtk已弃用,请使用pygobject)。

我们通过on_click2使用on_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