【发布时间】:2021-05-15 18:08:03
【问题描述】:
我正在尝试创建一个全屏窗口,其中带有相当长标签的 statictextctrl 布局在一个表格中,当它们很多时带有垂直滚动条。我需要做的是根据每个 statictextctrl 可用的宽度(基于每行的 textctrl 数量和 hpad)包装标签。不幸的是,当有一个很长的单词时,我无法让它工作,单词没有换行,即使我明确地将 textctrl 样式设置为wx.TE_BESTWRAP (无论如何这是默认设置,但我认为值得尝试) .知道如何实现这一目标吗?
import wx
import wx.lib.scrolledpanel as scrolled
class MyPanel(scrolled.ScrolledPanel):
def __init__(self, parent):
scrolled.ScrolledPanel.__init__(self, parent, -1)
## Configuring the panel
self.SetAutoLayout(1)
self.SetupScrolling()
self.SetScrollRate(1,40)
# needs to be called after main window's laytou, so its size is actually
# known and can be used to compute textctrl's width
def Build(self):
labelPerRow=7
hgap = 40
vgap = 20
label_width=int(self.GetClientSize()[0]/labelPerRow)-hgap
print("label width", label_width)
grid_sizer = wx.FlexGridSizer(labelPerRow, vgap, hgap)
self.SetSizer(grid_sizer)
i=0
for label in range(200) :
label = "very long title withaverybigwordthatdoesntfitonasinglelinesoitsquitehardtomanagewordwrap"+str(i)
title = wx.StaticText(self,
label=label,
style=wx.ALIGN_CENTRE_HORIZONTAL |
wx.TE_BESTWRAP)
title.Wrap(int(label_width))
grid_sizer.AddMany([(title)])
i = i+1
self.Layout()
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Test", style=wx.NO_BORDER)
self.Maximize(True)
frameSizer = wx.BoxSizer()
p = MyPanel(self)
frameSizer.Add(p, 1, wx.EXPAND)
self.SetSizer(frameSizer)
self.Layout()
p.Build()
app = wx.App(0)
frame = MyFrame()
frame.Show()
app.MainLoop()
【问题讨论】:
-
目前还不清楚想要达到什么目的,主要是因为您使用的是
StaticText而不是TextCtrl,如文中所述。尝试使用TextCtrl运行并添加wx.TE_MULTILINE样式。 (您需要丢失Wrap指令。) -
抱歉不清楚,我编辑了最初的帖子。我使用
StaticText,因为文本是只读的。我尝试使用TextCtrl,但遇到了一个问题:我无法更改宽度。我的目标是让所有TextCtrl(或StaticText)填满可用的水平空间。 -
您在
StaticText和TextCtrl之间混淆了flags,您有点在问静态文本是不可能的。屏幕必须在列中,sizer 会为您执行此操作,因此您必须调整项目。使用换行符拆分静态文本或使用带有 wx.TE_MULTILINE 标志的 TextCtrl。您还可以使用 wx.TE_READONLY 标志并使用 FlexGridSizersAddGrowableCol(n)即全部 7 个。请注意,结果可能并不像您希望的那样完美,但无论如何它永远不会赢得选美比赛。 -
我明白你的意思。我想我可以创建自己的
WrappedStaticText类。谢谢!
标签: wxpython word-wrap textctrl