0

我正在学习 wx,但遇到了这样的问题:假设我创建了几个 StaticText 对象,然后我想在某些事件上更改它的标签。例子:

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent=parent)
        self.panel=wx.Panel(self)
        for i in range(5):
            self.button=wx.Button(self.panel, -1, label='b'+str(i), pos=(20,30*i))
            self.button.Bind(wx.EVT_BUTTON, self.on_button)
            self.label=wx.StaticText(self.panel, -1, label='label'+str(i), pos=(120,30*i), name='label'+str(i))

    def on_button(self, event):
        b=event.GetEventObject().GetLabel()
        if b.endswith('1'):
            self.label1.SetLabel('sss')

x=wx.App()
y=MyFrame(None).Show()
x.MainLoop()

所以,如您所见,我想更改我之前创建的 self.label1 的标签,但由于错误而无法这样做:in on_button; AttributeError:“MyFrame”对象没有属性“label1”

我想我必须在创建对象时改变一些东西,但我不知道是什么。

4

2 回答 2

1

那么第一个问题是,在通过 for 循环的每次迭代中,您都会覆盖 self.button 和 self.label 实例。你永远不会创建一个名为“self.label1”的变量。有几种方法可以解决此问题。这是一种简单的方法:

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent=parent)
        self.panel=wx.Panel(self)
        for i in range(5):
            self.button=wx.Button(self.panel, -1, label='b'+str(i), pos=(20,30*i))
            self.button.Bind(wx.EVT_BUTTON, self.on_button)
            self.label=wx.StaticText(self.panel, -1, label='label'+str(i), pos=(120,30*i), name='label'+str(i))

    def on_button(self, event):
        b=event.GetEventObject().GetLabel()

        if b.endswith('1'):
            newLabel = "sss"
            self.resetLabel('1', newLabel)
        elif b.endswith('2'):
            self.resetLabel('2', "Number 2!")

    #----------------------------------------------------------------------
    def resetLabel(self, number, newLabel):
        """"""
        lbls = [widget for widget in self.panel.GetChildren() if isinstance(widget, wx.StaticText)]
        for lbl in lbls:
            if number in lbl.GetLabel():
                lbl.SetLabel(newLabel)
                break

x=wx.App()
y=MyFrame(None).Show()
x.MainLoop()

您还可以使用 setattr 和 getattr 来动态创建 self.label(1-N) ,如下所示:

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent=parent)
        self.panel=wx.Panel(self)
        for i in range(5):
            setattr(self, "button%s" % i, 
                    wx.Button(self.panel, -1, label='b'+str(i), pos=(20,30*i))
                    )
            btn = getattr(self, "button%s" % i)
            btn.Bind(wx.EVT_BUTTON, self.on_button)
            setattr(self, "label%s" % i,
                    wx.StaticText(self.panel, -1, label='label'+str(i), pos=(120,30*i), name='label'+str(i))
                    )
        print

    def on_button(self, event):
        b=event.GetEventObject().GetLabel()

        if b.endswith('1'):
            self.label1.SetLabel("sss")
        elif b.endswith('2'):
            self.label2.SetLabel("Number 2!")



x=wx.App()
y=MyFrame(None).Show()
x.MainLoop()
于 2013-03-25T13:47:15.957 回答
0

您可以使用 dict 将按钮映射到标签:

self.label[button] = label

然后,给定一个与按钮关联的事件,您可以找到关联的标签:

    button = event.GetEventObject()
    label = self.label[button]

import wx


class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent=parent)
        self.panel = wx.Panel(self)
        self.label = {}
        for i in range(5):
            button = wx.Button(
                self.panel, -1, label='b' + str(i), pos=(20, 30 * i))
            button.Bind(wx.EVT_BUTTON, self.on_button)
            label = wx.StaticText(self.panel, -1, label='label' + str(
                i), pos=(120, 30 * i), name='label' + str(i))
            self.label[button] = label

    def on_button(self, event):
        button = event.GetEventObject()
        label = self.label[button]
        label.SetLabel('sss')

x = wx.App()
y = MyFrame(None).Show()
x.MainLoop()
于 2013-03-25T13:45:23.677 回答