在某些情况下,连接信号与lambda不起作用?

0 投票
1 回答
1529 浏览
提问于 2025-04-16 17:34

我正在尝试用 Python 2.7 开发 pygtk 程序,遇到一个小问题,就是在使用 lambda 函数连接信号时:

  • 假设想要连接信号的类叫做 A_Class,而 信号 是字符串 "A_Signal"
  • 我们还有一个第二个类 B_class,它定义了一个公共函数 manage_signal
  • A_Class 有一个 实例 instance_b,它是 B_class 的一个对象

那么,我的问题是:

  • 如果我在 A_Class 的一个方法中调用 connect("A_Signal", lambda <signal_parameters> : instance_b.manage_signal),那么我们根本无法进入 instance_b 的 manage_signal 函数(例如:connect("activate", lambda menu_item : instance_b.manage_signal)
  • 但是如果我在 A_Class 中定义一个 manage_signal 方法,这个方法又调用 instance_b.manage_signal,然后调用 connect("A_Signal", lambda <signal_parameters> : self.manage_signal),这次就能正常工作了?

这里有一些代码来更清楚地说明问题

   class A_Class(gtk.Window):

       def __init__(self):
           super(gtk.Window, self).__init__()
           self.__instance_b = B_Class()
           # this does not work and i don't understand why
           self.connect("delete-event", lambda the_widget,the_event: self.__instance_b.manage_event)
           # this works
           self.connect("delete-event", self.__manage_event)

       def __manage_event(self):
           self.__instance_b.manage_event

   class B_Class(object):

        def manage_event(self):
            # do some stuffs ...

祝好

1 个回答

1

你的lambda表达式应该直接调用处理函数,而不是返回它:

self.connect("delete-event", lambda the_widget, the_event: \
    self.__instance_b.manage_event(the_widget, the_event))

当然,正如你所说,这样做其实没有必要,因为它和下面的代码是一样的:

self.connect("delete-event", self.__instance_b.manage_event)

这个lambda表达式最终只是把信号的参数传递给manage_event(),而connect()本身就可以做到这一点。

撰写回答