【问题标题】:Destroying old callback for button and installing new one销毁按钮的旧回调并安装新回调
【发布时间】:2015-08-28 00:37:37
【问题描述】:

我为完成按钮上的点击信号安装了两个回调。有没有办法取出(不执行)其中一个,例如

import threading
import time
from gi.repository import Gtk, GLib

class Test():
    def __init__(self):

        win = Gtk.Window()
        win.set_title("XYZ")

        win.set_border_width(10)

        box = Gtk.VBox(spacing=10)
        win.add(box)
        done_button = Gtk.Button(label="DONE")
        done_button.connect("clicked", self.callback1)

        #remove callback ??? callback1 should not be called when button is clicked.

        done_button.connect("clicked", self.callback2)

        box.pack_end(done_button, False, False, 0)

        win.show_all()
        win.maximize()
        win.connect("delete-event", Gtk.main_quit)

    def callback1(self, widget):
        print "callback1"

    def callback2(self, widget):
        print "callback2"


if __name__ == '__main__':
    test = Test()
    Gtk.main()

可以做些什么来移除回调1。

【问题讨论】:

    标签: python button callback gtk pygobject


    【解决方案1】:

    您需要获取信号的 id 才能断开它,因此将连接更改为:

    b_id = done_button.connect("clicked", self.callback1)
    

    然后使用GObject模块的断开功能:

    GObject.signal_handler_disconnect(done_button, b_id)
    

    或按照 elya5 的建议(因此您甚至不必导入 GObject):

    done_button.disconnect(b_id)
    

    记得先导入GObject模块(不是GLib)

    from gi.repository import Gtk, GObject
    

    【讨论】:

    • 您可以使用done_button.disconnect(handler_id) 实现相同的目的。然后你不需要 GObject 导入。 id 也是一个 python 内置函数,所以你应该坚持使用另一个名字。
    【解决方案2】:

    python-gtk-3-tutorial.readthedocs.io

    如果您由于某种原因丢失了“handler_id”(例如处理程序是使用 Gtk.Builder.connect_signals() 安装的),您仍然可以使用函数 disconnect_by_func() 断开特定回调:

    widget.disconnect_by_func(callback)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多