Получение значения TextCtrl из другой wxPanel - PullRequest
2 голосов
/ 29 ноября 2009

Я пытался заставить работать мое первое приложение wxWindow и столкнулся со следующей трудностью:
Я создаю wxPanel и добавляю к нему объект wxNotebook. Затем я добавляю страницу в блокнот, созданную из другого объекта wxPanel. Как мне получить доступ к значению TextCtrl из первого wxPanel во втором?

import wx

class BasicApp(wx.App):
  def OnInit(self):
    frame = BasicFrame(None, -1, "Test App")
    panel = BasicPanel(frame, -1);
    frame.Show(True)
    self.SetTopWindow(frame)
    return True;

class BasicFrame(wx.Frame):
  def __init__(self, parent, ID, title):
    wx.Frame.__init__(self, parent, ID, title,
                     wx.DefaultPosition, wx.Size(400, 300))
    self.CreateStatusBar()

class BasicPanel(wx.Panel):
  def __init__(self, parent, id):
    wx.Panel.__init__(self, parent, id)

    self.lblText1 = wx.StaticText(self, -1, "Text1:");
    self.txtText1 = wx.TextCtrl(self, 1001, "Text1", size = wx.Size(140, -1));
    self.line1 = wx.BoxSizer(wx.HORIZONTAL);
    self.line1.Add(self.lblText1, 0, wx.EXPAND);
    self.line1.Add(self.txtText1, proportion=1, flag=wx.LEFT, border=5);

    self.nb = wx.Notebook(self, -1);
    tab1 = Tab1(self.nb, -1);
    self.nb.AddPage(tab1, "Tab1");

    self.sizer = wx.BoxSizer(wx.VERTICAL)
    self.sizer.Add(self.line1, 0, wx.EXPAND)
    self.sizer.Add(self.nb, 1, wx.EXPAND)

    self.SetSizer(self.sizer)
    self.SetAutoLayout(1)
    self.sizer.Fit(self)
    self.Show(1)

class Tab1(wx.Panel):
  def __init__(self, parent, id):
    wx.Panel.__init__(self, parent, id);

    self.lblText2 = wx.StaticText(self, -1, "Text2:");
    self.txtText2 = wx.TextCtrl(self, 1101, "Text2", size = wx.Size(140, -1));
    self.line1 = wx.BoxSizer(wx.HORIZONTAL);
    self.line1.Add(self.lblText2, 0, wx.EXPAND);
    self.line1.Add(self.txtText2, 0, wx.EXPAND);

    self.lblMessage = wx.StaticText(self, -1, "Message:");
    self.txtMessage = wx.TextCtrl(self, 1102, "", style = wx.TE_MULTILINE);

    self.cmdCreate = wx.Button(self, 1103, "Create");
    self.cmdCreate.Bind(wx.EVT_BUTTON, self.Create_OnClick)
    self.line3 = wx.BoxSizer(wx.HORIZONTAL);

    self.sizer = wx.BoxSizer(wx.VERTICAL)
    self.sizer.Add(self.line1, 0, wx.EXPAND)
    self.sizer.Add(self.lblMessage, 0, wx.EXPAND)
    self.sizer.Add(self.txtMessage, 1, wx.EXPAND)
    self.sizer.Add(self.cmdCreate, 0, wx.LEFT)

    self.SetSizer(self.sizer)
    self.SetAutoLayout(1)
    self.sizer.Fit(self)
    self.Show(1)
  def Create_OnClick(self, event):
    text1 = "";
    text2 = self.txtText2.GetValue();
    self.txtMessage.SetValue(text1 + " " + text2);

app = BasicApp(0)
app.MainLoop()

Чтобы быть более конкретным, я хочу иметь доступ к значению txtText1 в методе Create_OnClick (). Как этого достичь?

1 Ответ

2 голосов
/ 30 ноября 2009

Одним из решений является передача элемента управления конструктору вкладки, после чего вы можете напрямую ссылаться на него. Например:

class Tab1(wx.Panel):
  def __init__(self, parent, id, textCtrl1):
    wx.Panel.__init__(self, parent, id);
    self.textCtrl1 = textCtrl1
  ...
  def Create_OnClick(self, event):
    text1 = self.textCtrl1

Другое решение - переместить обработчик Create_OnClick на базовую панель, поскольку он знает обо всех других панелях (и, следовательно, их дочерних элементах). Или создайте отдельный класс контроллера, который знает о различных виджетах и ​​может иметь обработчики, которые действуют от их имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...