当代码执行过程中某些文本长度稍后发生变化时,如何避免 wxPython 中的 StaticText 重叠或相互远离?

问题描述 投票:0回答:1

我有一些静态文本可能会在代码执行期间更改其内容。文本用作标题,有两部分 - 描述和相关数据(仍然是另一个文本),每个部分具有不同的文本颜色。

问题在于文本会保持程序首次启动时的位置,因此任何后续文本更改都将导致文本部分随机重叠或相互远离。

我需要的是一些刷新(或重置),以便程序忘记上次显示文本的位置的所有内容,然后像第一次启动程序一样显示文本。我怎样才能做到这一点?

这是测试代码;为简单起见,与问题相关的相关性仅适用于第一次点击:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import wx

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.SetSize((400, 300))
        self.SetTitle("test frame")
        self.panel_1 = wx.Panel(self, wx.ID_ANY)
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)

        self.variable_length_label = wx.StaticText(self.panel_1, wx.ID_ANY, "label: ")
        self.variable_length_label.SetForegroundColour(wx.Colour(0x00, 0x66, 0x66))
        sizer_2.Add(self.variable_length_label, 0, 0, 0)

        self.actual_data = wx.StaticText(self.panel_1, wx.ID_ANY, "ABC")
        self.actual_data.SetForegroundColour(wx.Colour(0xff, 0x66, 0x00))
        sizer_2.Add(self.actual_data, 0, 0, 0)

        self.button = wx.Button(self.panel_1, wx.ID_ANY, "Click once for longer text label and new data")
        self.button.SetToolTip("This exemple has relevance only on first click")
        sizer_1.Add(self.button, 0, wx.EXPAND, 0)
        self.panel_1.SetSizer(sizer_1)
        self.Layout()

        self.Bind(wx.EVT_BUTTON, self.on_click, self.button)

    def on_click(self, event):
        self.variable_length_label.SetLabel("muchlongertextlabel: ")
        self.actual_data.SetLabel("DEF")

class MyApp(wx.App):
    def OnInit(self):
        self.frame = MyFrame(None, wx.ID_ANY, "")
        self.SetTopWindow(self.frame)
        self.frame.Show()
        return True

if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()
wxpython
1个回答
0
投票

您需要执行

Layout()
来要求大小调整器围绕新的子数据重新排列。
您已将尺寸测量器应用于
panel_1
,因此您应该要求重新布置它。
在这种情况下,以下内容将在长版本和短版本之间切换文本。

def on_click(self, event):
    t = self.actual_data.GetLabel()
    if t == "ABC":
        self.variable_length_label.SetLabel("muchlongertextlabel: ")
        self.actual_data.SetLabel("DEF")
    else:
        self.variable_length_label.SetLabel("label: ")
        self.actual_data.SetLabel("ABC")
    self.panel_1.Layout()
© www.soinside.com 2019 - 2024. All rights reserved.