【发布时间】:2022-01-10 04:26:24
【问题描述】:
我已经阅读了很多与此类似的问题,但我正在屈服并提出自己的问题,因为没有任何效果。基本上,我希望我的wx.StaticText 在调整窗口大小时具有垂直居中的文本。我的理解是现有的解决方案不起作用,因为我关心StaticText 的背景,所以我不能简单地将标签本身垂直居中在一个sizer 中。我还看到它需要混乱的子类化才能拥有透明背景的 StaticText,因此将其覆盖在面板上听起来很困难。
这是一个最小的例子(在我的项目中,sizer 还有其他一些东西):
import wx
class MyFrame(wx.Frame):
def __init__(self):
super().__init__(None, title='Sample')
sizer=wx.BoxSizer(wx.VERTICAL)
label = wx.StaticText(self, -1, 'PLEASE VERTICALLY CENTER ME ;(', style=wx.ALIGN_CENTRE | wx.ST_NO_AUTORESIZE)
label.SetMinSize((300,300))
label.SetBackgroundColour((255,0,0))
sizer.Add(label, 1, wx.EXPAND | wx.ALL, 10)
self.SetSizerAndFit(sizer)
if __name__ == '__main__':
app=wx.App()
frame=MyFrame()
frame.Show()
app.MainLoop()
尽管如此,很难接受垂直居中文本并不简单。 让标签中的文本垂直居中的最简单方法是什么?
解决方案: 卡特林的回答给出了必要的概念!对于遇到此问题的其他任何人,这是一个完整的 sn-p。我在 StaticText 下方添加了一个按钮,以演示保持控制的垂直大小。如果您的应用程序不需要,可以完全移除垂直大小调整器。
import wx
class MyFrame(wx.Frame):
def __init__(self):
super().__init__(None, title='Sample')
sizer=wx.BoxSizer(wx.VERTICAL) # "main" sizer
panel = wx.Panel(self) # panel just for centering label
panel.SetBackgroundColour((255,0,0))
label = wx.StaticText(panel, -1, 'PLEASE VERTICALLY CENTER ME ;(', style=wx.ALIGN_CENTRE | wx.ST_NO_AUTORESIZE)
hsizer=wx.BoxSizer(wx.HORIZONTAL) # sizer for the panel
hsizer.Add(label, 1, wx.ALIGN_CENTER_VERTICAL)
panel.SetSizer(hsizer)
sizer.Add(panel, 1, wx.EXPAND)
btn = wx.Button(self, -1, 'Button')
sizer.Add(btn, 0, wx.EXPAND)
self.SetSizerAndFit(sizer)
if __name__ == '__main__':
app=wx.App()
frame=MyFrame()
frame.Show()
app.MainLoop()
【问题讨论】:
-
为什么需要
wxEXPAND | wxALL?你不能用wxEXPAND | wxALIGN_CENTER_VERTICAL吗? -
@Igor 据我所知,这些是不同的东西。 wx.ALL 只是意味着我想要一个边框,这不是一个重要的细节。不过,最重要的是,ALIGN_CENTER_VERTICAL 会对齐标签本身,而不是标签中的文本。它也与 wx.EXPAND 不兼容(如果标签占用了它所能占用的所有空间,那么就没有空间来对齐/居中它)。