我正在尝试创建一个自定义对话框,其中包含隐藏的用户和密码TextCtrls,并替换为FlexGridSizer中的某些帐户信息。有一个垂直BoxSizer,可以容纳一个面板和一些按钮。 Panel本身有一个垂直BoxSizer,里面装有几个水平BoxSizer和FlexGridSizer。
self.panel = wx.Panel(self)
self.vbox = wx.BoxSizer(wx.VERTICAL)
self.infoBox = wx.BoxSizer(wx.VERTICAL)
像这样放在一起:
self.panel.SetSizer(self.infoBox)
self.vbox.Add(self.panel, proportion=1, flag=wx.ALL | wx.EXPAND, border=5)
self.vbox.Add(self.butBox,
flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10)
self.SetSizer(self.vbox)
FlexGridSizer看起来像这样:
self.acctBox = wx.FlexGridSizer(5, 2, 5, 5)
self.userName = wx.StaticText(self.panel, label='Username:')
self.userNameData = wx.StaticText(self.panel)
self.acctType = wx.StaticText(self.panel, label='Account Type:')
self.acctTypeData = wx.StaticText(self.panel)
self.uploadLimit = wx.StaticText(self.panel, label='Upload Limit:')
self.uploadLimitData = wx.StaticText(self.panel)
self.uploaded = wx.StaticText(self.panel, label='Uploaded in Period:')
self.uploadedData = wx.StaticText(self.panel)
self.cycleExp = wx.StaticText(self.panel, label='Cycle Expiration:')
self.cycleExpData = wx.StaticText(self.panel)
self.acctBox.AddMany([self.userName, self.userNameData,
self.acctType, self.acctTypeData,
self.uploadLimit, self.uploadLimitData,
self.uploaded, self.uploadedData,
self.cycleExp, self.cycleExpData])
self.infoBox.Add(self.acctBox, proportion=1,
flag=wx.EXPAND | wx.ALL, border=10)
self.infoBox.Hide(self.acctBox, recursive=True)
开始看起来很好:
但是当我更新StaticTexts时:
self.infoBox.Hide(self.userBox)
self.infoBox.Hide(self.passBox)
self.userNameData = self.conn.publicUserInfo.username
self.acctTypeData = self.PrivledgeLevel(self.conn.user.privilege)
self.uploadLimitData = self.conn.accountLimits.uploadLimit
self.uploadedData = self.conn.syncState.uploaded
self.cycleExpData = self.conn.premiumInfo.premiumExpirationDate
self.infoBox.Show(self.acctBox)
# self.infoBox.Fit(self)
self.infoBox.Layout()
self.connStat.SetLabel('Connected')
没有更新任何内容,FlexGridSizer的底部被切断:
如果我添加self.infoBox.Fit(self)
,情况会更糟:
为了让StaticTexts更新,我在这里缺少什么?我已经检查了调试器,变量有值。他们只是没有被展示。如何在不调用Fit
和调整大小的情况下,使Dialog的大小正确,从一开始就适合所有内容?难道编码Dialog大小是唯一的方法吗?或者有没有办法动态地做到这一点?
答案 0 :(得分:1)
您实际上并未设置静态文本。您将其类实例上的名称重新分配给其他内容(字符串)。静态文本不会被垃圾收集器清理或清理的唯一原因是因为它们仍然被包含它们的sizer引用。
为了实际更改文字,您需要设置标签。例如,对于userData,您要调用self.userNameData.SetLabel(self.conn.publicUserInfo.username)
有关于设置标签here in the documentation的额外信息。