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

问题描述 投票:0回答:1

我不知道pygtk中

connect()
connect_after()
之间有什么区别。 有人可以用示例代码解释一下吗?

谢谢。

gtk pygtk
1个回答
8
投票

首先,这是

g_signal_connect_after
的定义:

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

但是您可能会问默认处理程序是什么,嗯,

GSignal 描述它非常具有描述性:

信号系统的基本概念是发射信号 信号。信号按类型引入并通过以下方式识别 字符串。为父类型引入的信号可在派生中使用 类型也是如此,所以基本上它们是每个类型的设施 遗传的。

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

对象方法处理程序在信号创建时提供(this 最常发生在对象类创建结束时), 而用户提供的处理程序经常连接和断开 到/从某些对象实例上的某个信号。

信号发射由五个阶段组成,除非提前停止:

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

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

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

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

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

用户提供的信号处理程序按照它们连接的顺序进行调用。

现在您知道了信号序列,接下来是

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

image

© www.soinside.com 2019 - 2024. All rights reserved.