在 wxpython 中动态创建文本控件.如何从他们那里检索数据



我创建了一个带有按钮的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

让我们看一下你的代码:

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

下一步:实际创建控件。以下是一些问题隐藏的地方:

  1. 您在循环中创建它,您必须将它们放在 for 循环块中(在您的变体中只有一个文本控件(存储在new_TextControl字段中)),它将是最后一个迭代v值的字段(这就是for的工作方式)。
  2. 你需要创建一些容器(还记得我们在上面创建的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字典中访问新创建字段的值:

self.f3.new_controls['Car'].GetValue()  # Receive input from 'Car' text control.

相关内容

最新更新