Как создать текстовое поле динамически?

Есть ли способ создать текстовое поле динамически, нажав кнопку? Поэтому я планирую создать графический интерфейс, где я предоставляю одно поле TextCtrl для ввода пользователем одного значения по умолчанию. Но если пользователь хочет ввести еще одно значение, должна быть кнопка "+" или кнопка "Добавить", где пользователь может создать чтобы программа могла динамически создавать еще одно поле textCtrl и отображать его в графическом интерфейсе, чтобы пользователь мог вводить свои данные в этом недавно созданном окне TextCtrl!

Заранее спасибо!

1 ответ

Это на самом деле довольно легко. Вот один из способов сделать это:

import wx

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

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

        self.mainSizer = wx.BoxSizer(wx.VERTICAL)
        self.txtSizer = wx.BoxSizer(wx.VERTICAL)

        txt = wx.TextCtrl(self)
        self.txtSizer.Add(txt, 0, wx.EXPAND|wx.ALL, 5)
        self.mainSizer.Add(self.txtSizer, 0, wx.EXPAND, 5)

        add_btn = wx.Button(self, label="Add")
        add_btn.Bind(wx.EVT_BUTTON, self.onAdd)
        process_btn = wx.Button(self, label="Process")
        process_btn.Bind(wx.EVT_BUTTON, self.onProcess)

        self.mainSizer.Add(add_btn, 0, wx.ALL, 5)
        self.mainSizer.Add(process_btn, 0, wx.ALL, 5)

        self.SetSizer(self.mainSizer)

    #----------------------------------------------------------------------
    def onAdd(self, event):
        """"""
        self.txtSizer.Add(wx.TextCtrl(self), 0, wx.EXPAND|wx.ALL, 5)
        self.mainSizer.Layout()

    #----------------------------------------------------------------------
    def onProcess(self, event):
        """"""
        children = self.txtSizer.GetChildren()
        for child in children:
            widget = child.GetWindow()
            if isinstance(widget, wx.TextCtrl):
                print widget.GetValue()


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

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


#----------------------------------------------------------------------
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

В качестве бонуса я также показываю, как получить информацию из текстовых элементов управления. Обратите внимание, что порядок добавления вкладок нарушается при добавлении текстового элемента управления.

Другие вопросы по тегам