假设我使用如下循环创建6个文本控制字段:
ticker_items = ['bid', 'ask', 'open', 'close', 'high', 'low']
for item in ticker_items:
wx.TextCtrl(self.panel, -1, value=item, size=(-1, -1))
如何在创建后更新这些内容?
答案 0 :(得分: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方法。
答案 1 :(得分:2)
一种非常简单的方法是将ctrl存储在字典中。 我修改了Mike的代码以使用字典而不是见下文。
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()
答案 2 :(得分:1)
你做不到。 您必须以某种方式保存对象(例如,对象列表)或为每个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]
答案 3 :(得分:1)
如果您想稍后引用它们,则不能像这样创建TextCtrl。存放它们。
一种方法是使用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')