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のラベルを変更したいのですが、エラーのために変更できません。AttributeError:'MyFrame'オブジェクトに属性'label1'がありません

オブジェクトを作成するときに何かを変更する必要があると思いますが、何がわかりません。

4

2 に答える 2

1

最初の問題は、forループの各反復で、self.buttonインスタンスとself.labelインスタンスを上書きすることです。「self.label1」という変数を作成することはありません。これを修正するには、いくつかのアプローチがあります。これを行う簡単な方法の1つは次のとおりです。

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 に答える