首页 > 解决方案 > 使用 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,我认为我不能传递额外的参数:

标签: listwxpythonbind

解决方案


可以使用命令中的,的lambda函数传递其他参数。 以这种方式使用,它允许您在. 请注意,该函数必须允许附加参数。 这里的事件函数为可能的参数提供默认值,以防它们没有被发送(例如,)。eventBind
appendevent
callback
callbackflag3

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单独创建纯粹是为了方便和清晰。

在此处输入图像描述


推荐阅读