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_click2
和on_click1
(按这个顺序)一个简单的例子,通过使用connect_after
为on_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