我创建了一个带有按钮的wxframe,当点击该按钮时会显示一个子框架,该框架会生成文本控件,其数据存储在名为“samples”的字典中,如下所示。子帧的想法是它是一个编辑窗口,用于编辑数据。
我的问题是我不知道如何从生成的文本控件中检索数据。我只能从上次生成的文本控件中获取数据。
以下是我创建的代码的简化版本:
import wx
class MyFrame1(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: MyFrame1.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
self.frame=wx.Frame.__init__(self, *args, **kwds)
self.panel_1 = wx.Panel(self, -1)
self.f3 = wx.Frame(None,-1,'Edit Tags')
self.editTag = wx.Button(self.panel_1, -1, "Edit Tags", size=(100, 50))
self.editTag.Bind(wx.EVT_BUTTON, self.editTags)
self.Bind( wx.EVT_CLOSE, self.CloseAll)
# end wxGlade
#-------------------------------------------------------------------------------
def editTags(self, event): # wxGlade: MyFrame.<event_handler>
samples={
"Face1":"(100,100)", \
"Face2":"(50,40)", \
"Car":"(500,230)", \
"Wallclock":"(120,230)"
}
self.f3.okButton = wx.Button(self.f3, label="OK")
self.f3.okButton.Bind(wx.EVT_BUTTON, self.onOK)
self.f3.okButton.SetPosition((40,200))
spacer=0
for k, v in sorted(samples.iteritems()):
print "K: ", k
spacer=spacer+40
print "V: ", v
print
self.f3.new_TextControl = wx.TextCtrl(self.f3, -1, value=k)
self.f3.new_TextControl.SetPosition((40,spacer))
print
self.f3.Show()
#-------------------------------------------------------------------------------
def onOK(self, event): # wxGlade: MyFrame.<event_handler>
print self.f3.new_TextControl.GetValue()
print self.f3.new_TextControl.GetValue()
print "OK clicked"
self.f3.Hide()
#-------------------------------------------------------------------------------
def CloseAll(self, event):
self.DestroyChildren() # First destroy child frames
self.Destroy() # Then destroy the parent frame
self.f3.Close()
self.Close()
#-------------------------------------------------------------------------------
# end of class MyFrame1
if __name__ == "__main__":
app = wx.PySimpleApp(0)
frame_1 = MyFrame1(None, -1, "")
app.SetTopWindow(frame_1)
frame_1.Show()
app.MainLoop()
欢迎任何替代解决方案
我正在使用python 2.7.2。和wxpython
答案 0 :(得分:2)
让我们看看你的代码:
def editTags(self, event): # wxGlade: MyFrame.<event_handler>
samples={
"Face1":"(100,100)", \
"Face2":"(50,40)", \
"Car":"(500,230)", \
"Wallclock":"(120,230)"
}
self.f3.okButton = wx.Button(self.f3, label="OK")
self.f3.okButton.Bind(wx.EVT_BUTTON, self.onOK)
self.f3.okButton.SetPosition((40,200))
让我们为您的新控件存储(将在下面讨论):
self.f3.new_controls = {}
spacer=0
在这里,您将迭代未来的字段,这是一个问题:
for k, v in sorted(samples.iteritems()):
print "K: ", k
spacer=spacer+40
print "V: ", v
print
下一步:实际创建控件。这是隐藏一些问题的地方:
new_TextControl
字段中)),它将是一个字段最后一次迭代v
值(这就是for
的工作原理)。self.f3.new_controls
?)来保存您的控件(例如dict)
。因此,让我们对您的代码进行一些进一步的更改:
# Dict will hold {'Car': wx.TextCtrl(...), 'Wallclock': ...}
self.f3.new_controls[k] = wx.TextCtrl(self.f3, -1, value=k)
self.f3.new_controls[k].SetPosition((40,spacer))
你展示你的框架,没关系:
self.f3.Show()
您可以从new_controls
dict:
self.f3.new_controls['Car'].GetValue() # Receive input from 'Car' text control.