Python 使用循环在单击时生成具有单独事件的唯一位图按钮

Python 使用循环在单击时生成具有单独事件的唯一位图按钮,python,wxpython,Python,Wxpython,我对Python还很陌生,所以我希望您能原谅我编写了如此业余的代码。我尝试过大量的例子来做类似的事情,但我很难弄清楚他们在做什么,这是不同的。在示例中,我看到循环生成的每个按钮都有不同的动作,对于我来说,只有循环中的最后一个按钮受单击的影响,无论我按下哪个按钮。代码如下: import wx import mmap class pt: Note = open('note.txt', "r+") buf = mmap.mmap(Note.fileno(), 0) TL

我对Python还很陌生,所以我希望您能原谅我编写了如此业余的代码。我尝试过大量的例子来做类似的事情,但我很难弄清楚他们在做什么,这是不同的。在示例中,我看到循环生成的每个按钮都有不同的动作,对于我来说,只有循环中的最后一个按钮受单击的影响,无论我按下哪个按钮。代码如下:

import wx
import mmap

class pt:

    Note = open('note.txt', "r+")
    buf = mmap.mmap(Note.fileno(), 0)
    TL = 0
    readline = buf.readline
    while readline():
        TL += 1

class MainWindow(wx.Frame):

    def __init__(self, parent, title):
        w, h = wx.GetDisplaySize()
        x = w * 0
        y = h - bdepth

        wx.Frame.__init__(self, parent, title = title, pos = (x, y), size = (200,bdepth), style = wx.STAY_ON_TOP)

        self.__DoLayout()

        self.Bind(wx.EVT_BUTTON, self.OnClick)

        self.Show(True)

    def __DoLayout(self):

        self.__DoButtons(wx.Panel(self, size=(200,bdepth), pos=(0,0), name='panel'), 'Cheese')

    def __DoButtons(self, panel, label):

        for i, line in enumerate(pt.Note):
            solid = wx.EmptyBitmap(200,50,-1)
            dc = wx.MemoryDC()
            dc.SelectObject(solid)
            solidbrush = wx.Brush(wx.Colour(75,75,75),wx.SOLID)
            solidpen = wx.Pen(wx.Colour(75,75,75),wx.SOLID)
            dc.SetBrush(solidbrush)
            dc.SetPen(solidpen)
            dc.DrawRectangle(0, 0, 200, 50)
            dc.SetTextForeground(wx.Colour(255, 255, 255))
            dc.DrawText(line.rstrip(), 30,  17)
            dc.SelectObject(wx.NullBitmap)

            self.checked = wx.Image('buttonchecked.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()
            dc = wx.MemoryDC()
            dc.SelectObject(self.checked)
            dc.SetTextForeground(wx.Colour(200, 255, 0))
            dc.DrawText(line.rstrip(), 30,  17)
            dc.SelectObject(wx.NullBitmap)

            self.b = wx.BitmapButton(panel, i + 800, solid, (0,  i * 50), (solid.GetWidth(), solid.GetHeight()), style = wx.NO_BORDER, name=line.rstrip())

    def OnClick(self, event):
        self.b.SetBitmapDisabled(self.checked)
        self.b.Enable(False)
        print('cheese')

bdepth = pt.TL * 50
app = wx.App(False)
frame = MainWindow(None, "Sample editor")
app.MainLoop()enter code here

只有最后一个按钮起作用,因为每次通过u DoButtons循环时,都会将self.b重新分配给不同的按钮。因此,循环完成后,self.b仅分配给最后一个按钮。可以使用event.GetEventObject()方法按下按钮

将OnClick方法更改为:

def OnClick(self, event):
    button = event.GetEventObject()
    button.SetBitmapDisabled(self.checked)
    button.Enable(False)
    print('cheese')

只有最后一个按钮起作用,因为每次通过u DoButtons循环时,都会将self.b重新分配给不同的按钮。因此,循环完成后,self.b仅分配给最后一个按钮。可以使用event.GetEventObject()方法按下按钮

将OnClick方法更改为:

def OnClick(self, event):
    button = event.GetEventObject()
    button.SetBitmapDisabled(self.checked)
    button.Enable(False)
    print('cheese')

这很有道理。谢谢你,这修复了它,也帮助我更好地理解了它的工作原理。@Tryst:bind
DoButtons()方法中循环中的每个按钮也会更好。
self.bind(wx.EVT\u button,self.OnClick,self.b)
@volting:谢谢你的建议。我最初是这样做的,但当我试图复制一个示例时改变了它。根据你的建议,它运行得稍微平稳一些。这很有道理。谢谢你,这修复了它,也帮助我更好地理解了它的工作原理。@Tryst:bind
DoButtons()方法中循环中的每个按钮也会更好。
self.bind(wx.EVT\u button,self.OnClick,self.b)
@volting:谢谢你的建议。我最初是这样做的,但当我试图复制一个示例时改变了它。根据你的建议,它运行得稍微平稳一些。