wxpython:StaticText 帶有背景的垂直居中文本

埃利亞斯

我已經閱讀了很多與此類似的問題,但我正在屈服並製作自己的問題,因為沒有任何效果。基本上,我想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()

儘管如此,很難接受垂直居中文本並不簡單。使標籤中的文本垂直居中的最簡單方法是什麼?


解決方案: catalin 的回答給出了必要的概念!這是針對遇到此問題的任何其他人的完整片段。我在 StaticText 下方添加了一個按鈕來演示仍處於控制中的垂直 sizer。如果您的應用程序不需要它,可以完全刪除垂直尺寸器。

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()
卡特琳娜

在 C++ 中,一種快速的方法如下所示:

    wxPanel* p = new wxPanel(this); // you don't need to put it in a sizer if it's the only child
    p->SetBackgroundColour({ 255, 0, 0 }); // this will be inherited by children
    wxStaticText* label = new wxStaticText(p, wxID_ANY, "PLEASE VERTICALLY CENTER ME ;(");

    wxSizer* s = new wxBoxSizer(wxHORIZONTAL); // for vertical one, you'd need stretch-spacers, and could not use wxALIGN_CENTER_VERTICAL, see below
    s->Add(label, wxSizerFlags(1).Align(wxALIGN_CENTER_VERTICAL));
    p->SetSizer(s);

請注意,如果您希望文本在調整大小時換行,wxStaticText則可能無法正確調整大小,您可能需要將其替換為其他內容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章