Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wxpython中事件的绑定仅适用于最后一个事件_Python_Wxpython_Signals Slots - Fatal编程技术网

wxpython中事件的绑定仅适用于最后一个事件

wxpython中事件的绑定仅适用于最后一个事件,python,wxpython,signals-slots,Python,Wxpython,Signals Slots,我试图用多个按钮自动填充屏幕(使用for循环) 以下是片段: i = 0 for w in [1,2,3,4,5,6,7,8]: by.append(wx.Button(panel,label=w,pos = wx.Point(50*i,0))) by[i].Bind(wx.EVT_LEFT_DOWN,lambda event: self.OnClicked(event,by[i])) i += 1 i = 0 当事件发生

我试图用多个按钮自动填充屏幕(使用for循环)

以下是片段:

    i = 0
    for w in [1,2,3,4,5,6,7,8]:
        by.append(wx.Button(panel,label=w,pos = wx.Point(50*i,0)))
        by[i].Bind(wx.EVT_LEFT_DOWN,lambda event: self.OnClicked(event,by[i]))
        i += 1
    i = 0

当事件发生时,由于我设置了
I=0
,因此所有事件都会路由到第一个按钮,即使我单击了最后一个按钮。我知道如果我在没有for循环的情况下设置插槽,它就会工作。但是假设我需要在一个屏幕上创建大约50个按钮,我想自动完成。如何设置插槽?

问题在于lambda表达式
lambda event:self.OnClicked(event,by[I])
。您可以在此处阅读有关基本问题的更多信息:

但简而言之,
i
在创建lambda表达式时不是固定的。循环结束后,所有lambda表达式仍然引用
i
。这意味着它们都具有相同的值

一个糟糕的解决方案是使用以下方法:

by[i].Bind(wx.EVT_LEFT_DOWN,lambda event, i=i: self.OnClicked(event,by[i]))
但最好使用另一个helper函数进行变量绑定:

def addOnClicked(i,w):
    by.append(wx.Button(panel,label=w,pos = wx.Point(50*i,0)))
    by[i].Bind(wx.EVT_LEFT_DOWN,lambda event: self.OnClicked(event,by[i]))

for i in range(8):
    addOnClicked(i,i+1)