1

次のようなループを使用して 6 つのテキスト コントロール フィールドを作成しているとします。

ticker_items = ['bid', 'ask', 'open', 'close', 'high', 'low']
for item in ticker_items:
    wx.TextCtrl(self.panel, -1, value=item, size=(-1, -1))

作成後にこれらを更新するにはどうすればよいですか?

4

4 に答える 4

2

それはいけません。何らかの方法でオブジェクトを保存する (オブジェクトのリストを作成する) か、各 TextCtrl に異なる ID を与える必要があります。

例えば:

ticker_items = [('bid', 1000), ('ask', 1001),
                ('open', 1002), ('close', 1003),
                ('high', 1004), ('low', 1005)]

for item, id in ticker_items:
    wx.TextCtrl(self.panel, id=id, value=item, size=(-1, -1))

次に、使用できます

my_textctrl = self.panel.FindWindowById(id_of_my_ctrl)

特定のコントロールを取り戻す

または、リストを使用します。

ticker_items = ['bid', 'ask', 'open', 'close', 'high', 'low']
self.my_controls = []
for item in ticker_items:
    text_control = wx.TextCtrl(self.panel, -1, value=item, size=(-1, -1))
    self.my_controls.append(text_control)

テキスト番号0を取得すると

 my_textctrl = self.my_controls[0]
于 2013-03-27T17:15:00.747 に答える
2

もっと簡単な方法があります。テキスト コントロールに一意の名前を渡し、それを使用してそれらを更新できます。以下に、最初の 2 つのコントロールを更新する簡単な例を示します。

import wx

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        sizer = wx.BoxSizer(wx.VERTICAL)
        ticker_items = ['bid', 'ask', 'open', 'close', 'high', 'low']
        for item in ticker_items:
            sizer.Add(wx.TextCtrl(self, value=item, size=(-1, -1), name=item) )

        btn = wx.Button(self, label="Update")
        btn.Bind(wx.EVT_BUTTON, self.updateTextCtrls)
        sizer.Add(btn)

        self.SetSizer(sizer)

    #----------------------------------------------------------------------
    def updateTextCtrls(self, event):
        """"""
        txtCtrls = [widget for widget in self.GetChildren() if isinstance(widget, wx.TextCtrl)]
        for ctrl in txtCtrls:
            if ctrl.GetName() == "bid":
                ctrl.SetValue("$100")
            elif ctrl.GetName() == "ask":
                ctrl.SetValue("$500")


########################################################################
class MainFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="TextCtrl Tutorial")
        panel = MyPanel(self)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MainFrame()
    app.MainLoop()

テキスト コントロールへの参照を作成する唯一の方法は、ikaros45 が言及した setattr メソッドを使用することです。

于 2013-03-27T17:46:36.503 に答える
2

本当に簡単な方法は、ctrl を辞書に保存することです。代わりに辞書を使用するようにマイクのコードを変更しました。以下を参照してください。

import wx

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        sizer = wx.BoxSizer(wx.VERTICAL)
        ticker_items = ['bid', 'ask', 'open', 'close', 'high', 'low']
        self.ticker_ctrls = {}
        for item in ticker_items:
            ctrl = wx.TextCtrl(self, value=item, size=(-1, -1), name=item)
            sizer.Add(ctrl)
            self.ticker_ctrls[item] = ctrl

        btn = wx.Button(self, label="Update")
        btn.Bind(wx.EVT_BUTTON, self.updateTextCtrls)
        sizer.Add(btn)

        self.SetSizer(sizer)

    #----------------------------------------------------------------------
    def updateTextCtrls(self, event):
        """"""
        self.ticker_ctrls['bid'].SetValue('$100')
        self.ticker_ctrls['ask'].SetValue('$500')


########################################################################
class MainFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="TextCtrl Tutorial")
        panel = MyPanel(self)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MainFrame()
    app.MainLoop()
于 2013-03-27T18:29:01.873 に答える
1

後で参照したい場合、このような TextCtrl を作成することはできません。それらを保存します。

1 つの方法は、settatr() を使用してそれらをオブジェクトに追加することです。オプションで追加情報を提供するためのプレフィックス (私は '_text' を使用しました)

http://docs.python.org/2/library/functions.html#setattr

ticker_items = ['bid', 'ask', 'open', 'close', 'high', 'low']
for item in ticker_items:
    text_control = wx.TextCtrl(self.panel, -1, value=item, size=(-1, -1))
    setattr(self, '_text_' + item, text_control)

後で、たとえば次のようにアクセスして値を変更できます。

self._text_bid.SetValue('Bid v2.0')
于 2013-03-27T17:21:24.047 に答える