从不同的wxPanel获取TextCtrl的值

2 投票
1 回答
1059 浏览
提问于 2025-04-15 16:30

我在尝试让我的第一个wxWindow应用程序正常工作时遇到了一个问题:
我创建了一个wxPanel,并在里面添加了一个wxNotebook对象。然后,我又从另一个wxPanel对象中添加了一个页面到这个笔记本里。我想知道如何在第二个wxPanel中访问第一个wxPanel里TextCtrl的值。

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()

更具体一点,我想在Create_OnClick()方法中访问txtText1的值。我该怎么做呢?

1 个回答

2

一种解决办法是把控制权交给标签的构造函数,这样你就可以直接引用它了。比如:

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 这个处理程序移动到基础面板,因为它对所有其他面板都很了解(所以也知道它们的子元素)。或者,你可以创建一个单独的控制器类,这个类了解各种小部件,并且可以有处理程序来代表它们所有人进行操作。

撰写回答