在某些情况下,连接信号与lambda不起作用?
我正在尝试用 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()
本身就可以做到这一点。