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

时间:2011-05-13 09:33:44

标签: python lambda pygtk

我正在使用python 2.7试验pygtk程序开发,我在使用lambda函数连接信号时遇到一些问题:

  • 让我们说想要连接信号的班级是班级A_Class 信号是字符串“A_Signal”
  • 我们还处理了第二个类B_class定义公共函数manage_signal
  • A_Class处理实例 instance_b of B_class

所以,这是我的问题: 我不明白为什么:

  • 如果我从A_Class instance =&gt;的方法中调用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) =&gt;这次有效吗?

这里有些代码更明确

   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 个答案:

答案 0 :(得分: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()可以完全自行完成。