Python 使用循环在单击时生成具有单独事件的唯一位图按钮
我对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
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:bindDoButtons()方法中循环中的每个按钮也会更好。self.bind(wx.EVT\u button,self.OnClick,self.b)
@volting:谢谢你的建议。我最初是这样做的,但当我试图复制一个示例时改变了它。根据你的建议,它运行得稍微平稳一些。