代码之家  ›  专栏  ›  技术社区  ›  Nomad

pygtk中connect()和connect\u after()之间的差异

  •  3
  • Nomad  · 技术社区  · 7 年前

    我不知道他们之间有什么不同 connect() connect_after()

    谢谢

    1 回复  |  直到 7 年前
        1
  •  7
  •   José Fonte    7 年前

    首先,以下是 g_signal_connect_after :

    将GCallback函数连接到特定对象的信号。这个 将调用处理程序 .

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

    信号系统的基本概念是发射信号 信号每种类型引入信号,并通过 类型,因此基本上它们是每种类型的设施,即

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

    对象方法处理程序在信号创建时提供(此 最常见的情况是在对象类创建结束时, 而用户提供的处理程序经常连接和断开连接

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

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

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

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

    类的默认处理程序;为什么这样有用?

    假设我有一个发出“初始化”信号的对象,其中 在类处理程序之后,以便可以使用已初始化的 对象。

    这种性质通常是先安装G_SIGNAL_RUN_;如果 我没有错,这意味着它的默认处理程序将在之前被调用 用户处理程序。

    我们连接两种方法的一个简单示例, on_click2 on_click1 (根据本命令),通过使用 connect_after 对于 点击2

    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()
    

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

    enter image description here