list - 使用 bind 和 wxpython 在列表中的位置
问题描述
如何确定列表中的位置?我有以下源代码:
def __init__(self, parent):
self.tickets = []
for i in list(range(15)):
self.intRandomNum=self.getRandomNum(i)
self.tickets.append(wx.StaticBitmap(self.panels2[i], -1, wx.Bitmap(self.ticketImages[self.intRandomNum])))
self.tickets[i].Bind(wx.EVT_LEFT_DOWN, self.cardChoice)
def cardChoice(self, event):
alert = wx.MessageDialog(self, _("Do you want to choice this card?"),
_("Cardchoice"), wx.YES_NO|wx.ICON_EXCLAMATION)
if alert.ShowModal() == wx.ID_YES:
ret = wx.MessageDialog(self, _("This card:"+repr(self.intRandomNum)),
_("Cardchoice"), wx.YES_NO|wx.ICON_EXCLAMATION)
ret.ShowModal()
使用 intRandomNum 的输出,我只能得到最后一个随机值。但是我怎样才能输出我点击了哪张卡片呢?使用 Bind,我认为我不能传递额外的参数:
解决方案
可以使用命令中的,的lambda
函数传递其他参数。
以这种方式使用,它允许您在.
请注意,该函数必须允许附加参数。
这里的事件函数为可能的参数提供默认值,以防它们没有被发送(例如,)。event
Bind
append
event
callback
callback
flag3
import wx
class TestFrame(wx.Frame):
def __init__(self, *args):
wx.Frame.__init__(self, *args)
panel = wx.Panel(self, -1)
button = wx.Button(panel, -1, "Click me", pos=(10,10), size=(100,40))
button.Bind(wx.EVT_BUTTON, lambda event: self.OnButton(event, flag1="1", flag2="2"))
self.Show()
def OnButton(self, event, flag1=None, flag2=None, flag3=None):
print ("The Button was pressed")
print ("Flag1 was set to ", flag1)
print ("Flag2 was set to ", flag2)
print ("Flag3 was set to ", flag3)
if __name__ == "__main__":
app = wx.App()
myframe = TestFrame(None, -1, "Button lambda event Test")
app.MainLoop()
编辑以上适用于文字赋值,但在循环中使用变量,循环计数的值不断变化并保留为最终值。
问题是,据我所知,lambda 函数在执行时评估表达式,因此它获取变量的最终/当前值。
在这里,我调整了lambda
'y' 的动态值以允许这样做。
import wx
class TestFrame(wx.Frame):
def __init__(self, *args):
wx.Frame.__init__(self, *args)
panel = wx.Panel(self, -1)
sizer = wx.BoxSizer(wx.VERTICAL)
buttons = []
for i in range(10):
buttons.append(wx.Button(panel, id = i, label=str(i), size=(100,40)))
sizer.Add(buttons[i])
lmda = lambda event, y = i: self.OnButton(event, flag1=int(y), flag2="z")
buttons[i].Bind(wx.EVT_BUTTON, lmda )
panel.SetSizer(sizer)
self.Show()
def OnButton(self, event, flag1=None, flag2=None, flag3=None):
print ("The Button was pressed", flag1)
if __name__ == "__main__":
app = wx.App()
myframe = TestFrame(None, -1, "Button lambda event Test")
app.MainLoop()
请注意,lambda
单独创建纯粹是为了方便和清晰。
推荐阅读
- tmux - 如何在 tmux 状态行中显示当前命令执行时间
- c++ - Nullptr - 布尔赋值
- javascript - 将查询参数添加到当前现有查询参数的链接
- php - laravel 获取下一个数据库请求的数据库数据
- swift - 如何在 Swift 中的特定索引处显示 collectionView
- c# - 如何在 Blazor WASM 客户端中访问 Httpclient 标头
- node.js - Nan 构建和循环数组
- macos - ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) on Mac Big Sur
- javascript - ANGULAR/IONIC ERROR 错误:尝试区分“[object Object]”时出错。只允许使用数组和可迭代对象
- html - 标题/导航 HTML CSS 之间的白线填充问题