【问题标题】:wxPython - centering text in wx.Notebook tabs?wxPython - 在 wx.Notebook 选项卡中居中文本?
【发布时间】:2021-08-13 07:52:34
【问题描述】:

我正在为 GUI 编写一个使用 wxPython 的应用程序。我快到了,但有一些小的审美问题困扰着我。也就是说,在程序结束时(“结果”框架),我有两个嵌套笔记本。我希望页面选择选项卡的文本位于所述选项卡的中心——而不是默认的左对齐。我已经浏览了 wxPython 文档并搜索了我最好的,但没有运气。有谁知道怎么做?

我附上了一些显示我想要的行为的最小代码(即,您选择笔记本页面的选项卡中的左对齐文本),以及来自真实的应用程序(当然,它有一个更复杂的界面——但如果它存在的话,我认为解决方案应该很简单)

import wx

class ResultFrame(wx.Frame):
    def __init__(self, parent):
        super(ResultFrame, self).__init__(parent, -1, title = "Results",
         style=wx.CAPTION|wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.SYSTEM_MENU|wx.RESIZE_BORDER)
        self.targets = ['these','are','some','strings']
        self.SetMinSize(wx.Size(1590,900))
        self.InitUI()

    def InitUI(self):
        self.mainpnl = wx.Panel(self)
        self.mainpnl.SetSize(wx.Size(1590,900))
        self.mainsizer = wx.BoxSizer(wx.HORIZONTAL)
        self.ctrlsizer = wx.BoxSizer(wx.VERTICAL)

        self.restart = wx.Button(self.mainpnl, wx.ID_ANY, "Start Over",\
         size=wx.Size(150,90))
        self.interp = wx.Button(self.mainpnl, wx.ID_ANY, "Help Interpreting\n"
         "Results", size=wx.Size(150,90))
        self.nb = wx.Notebook(self.mainpnl)
        for idx, tar in enumerate(self.targets):
            self.nb.AddPage(wx.Panel(self.nb, -1, size=wx.Size(850,820)), tar)
        self.ctrlsizer.Add(self.restart, 0, wx.ALL, 5)
        self.ctrlsizer.AddStretchSpacer()
        self.ctrlsizer.Add(self.interp, 0, wx.ALL, 5)
        self.mainsizer.Add(self.ctrlsizer, 0, wx.ALL, 0)
        self.mainsizer.Add(self.nb, 1, wx.EXPAND)
        self.mainpnl.SetSizerAndFit(self.mainsizer)

def main():
    app = wx.App()
    frm=ResultFrame(None)
    frm.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()

【问题讨论】:

    标签: python-3.x user-interface wxpython


    【解决方案1】:

    在 wxPython 中,Sizers 用于布置窗口或窗口集合。
    笔记本也不例外,因为它也可以使用 sizer 或 sizer 集合来布局其标签。
    Sizer 允许定位和对齐。

    import wx
    
    class ResultFrame(wx.Frame):
        def __init__(self, parent):
            super(ResultFrame, self).__init__(parent, -1, title = "Results",
             style=wx.CAPTION|wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.SYSTEM_MENU|wx.RESIZE_BORDER)
            #self.targets = ['these','are','some','strings']
            self.SetMinSize(wx.Size(1000,-1))
            self.InitUI()
    
        def InitUI(self):
            self.mainpnl = wx.Panel(self)
            self.mainpnl.SetSize(wx.Size(1590,900))
            self.mainsizer = wx.BoxSizer(wx.HORIZONTAL)
            self.ctrlsizer = wx.BoxSizer(wx.VERTICAL)
    
            self.restart = wx.Button(self.mainpnl, wx.ID_ANY, "Kubla Khan",\
             size=wx.Size(150,90))
            self.interp = wx.Button(self.mainpnl, wx.ID_ANY, "Samuel Taylor Coleridge\n"
             "Biography", size=wx.Size(150,90))
            self.nb = wx.Notebook(self.mainpnl)
    #        for idx, tar in enumerate(self.targets):
    #            self.nb.AddPage(wx.Panel(self.nb, -1, size=wx.Size(850,820)), tar)
            tab1 = wx.Panel(self.nb, -1)
            tab2 = wx.Panel(self.nb, -1)
    
            msg = '''In Xanadu did Kubla Khan
    A stately pleasure dome decree:
    Where Alph, the sacred river, ran
    Through caverns measureless to man
        Down to a sunless sea.
    So twice five miles of fertile ground
    With walls and towers were girdled round:
    And there were gardens bright with sinuous rills,
    Where blossomed many an incense-bearing tree;
    And here were forests ancient as the hills,
    Enfolding sunny spots of greenery.'''
            t1_text = wx.StaticText(tab1, -1, label=msg)
            t1_butt = wx.Button(tab1, -1, label="Next")
            t1sizer = wx.BoxSizer(wx.VERTICAL)
            t1sizer.Add(t1_text, 0, wx.ALIGN_CENTER|wx.ALL, 5)
            t1sizer.Add(t1_butt, 0, wx.ALIGN_RIGHT|wx.ALL, 5)
            tab1.SetSizer(t1sizer)
            self.nb.AddPage(tab1,"Stanza 1")
    
            msg = '''But oh! that deep romantic chasm which slanted
    Down the green hill athwart a cedarn cover!
    A savage place! as holy and enchanted
    As e'er beneath a waning moon was haunted
    By woman wailing for her demon lover!
    And from this chasm, with ceaseless turmoil seething,
    As if this earth in fast thick pants were breathing,
    A mighty fountain momently was forced:
    Amid whose swift half-intermitted burst
    Huge fragments vaulted like rebounding hail,
    Or chaffy grain beneath the thresher's flail:
    And ’mid these dancing rocks at once and ever
    It flung up momently the sacred river.
    Five miles meandering with a mazy motion
    Through wood and dale the sacred river ran,
    Then reached the caverns measureless to man,
    And sank in tumult to a lifeless ocean:
    And ’mid this tumult Kubla heard from far
    Ancestral voices prophesying war!'''
            t2_text = wx.StaticText(tab2, -1, label=msg)
            t2_pbutt = wx.Button(tab2, -1, label="Prev")
            t2_nbutt = wx.Button(tab2, -1, label="Next")
            t2sizer = wx.BoxSizer(wx.VERTICAL)
            t2sizer.Add(t2_text, 0, wx.ALIGN_CENTER|wx.ALL, 5)
            t2sizer.Add(t2_pbutt, 0, wx.ALIGN_RIGHT|wx.ALL, 5)
            t2sizer.Add(t2_nbutt, 0, wx.ALIGN_RIGHT|wx.ALL, 5)
            tab2.SetSizer(t2sizer)
            self.nb.AddPage(tab2,"Stanza 2")
            
            self.ctrlsizer.Add(self.restart, 0, wx.ALL, 5)
            self.ctrlsizer.AddStretchSpacer()
            self.ctrlsizer.Add(self.interp, 0, wx.ALL, 5)
            self.mainsizer.Add(self.ctrlsizer, 0, wx.ALL, 0)
            self.mainsizer.Add(self.nb, 1, wx.EXPAND)
            self.mainpnl.SetSizerAndFit(self.mainsizer)
    
            t1_butt.Bind(wx.EVT_BUTTON, self.Next)
            t2_nbutt.Bind(wx.EVT_BUTTON, self.Next)
            t2_pbutt.Bind(wx.EVT_BUTTON, self.Prev)
    
        def Next(self, event):
            p = self.nb.GetSelection()
            p += 1 
            p = min(p, self.nb.GetRowCount())
            self.nb.SetSelection(p)
    
        def Prev(self, event):
            p = self.nb.GetSelection()
            p -= 1 
            p = max(0, p)
            self.nb.SetSelection(p)
    
    def main():
        app = wx.App()
        frm=ResultFrame(None)
        frm.Show()
        app.MainLoop()
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

    • 感谢您的快速回复!是的,我使用 sizers 来布置每个页面的内容,但我指的是您单击的小标签(除非像您那样使用自定义的下一个/上一个按钮)来显示给定页面。例如,在我原始帖子所附的屏幕截图中,框架的右半部分有两个选项卡 - “LOD”和“Resuduals”。我想将这些选项卡(而不是它们附加到的面板)中的文本居中,因此,例如,“LOD”不会远离选项卡区域的一侧。类似于如何将按钮内的文本对齐到死点,向左、向右、向上、向下
    • 我刚刚注意到您的屏幕截图中的选项卡句柄确实显示为居中(尽管可能只是因为“stanza X”比“LOD”长),并且您正在运行 Linux(或者可能是 macOS.. . 当他们发布了被称为 Catalina 的可憎之物时,我完全放弃了苹果)。也许这种行为是系统相关的并且没有 wx 工具来控制它?我会假设标签句柄/耳朵/无论它们被称为什么的布局都像按钮一样容易配置......但到目前为止还没有这样的运气
    • 要么,我将不得不逐字挑选你的问题,检查标点符号以确保我知道问题的真正含义,或者,你需要非常具体。我有一种感觉,我们不止一次有不同的目的。为了避免对这一点的所有怀疑,关于在标签标题本身而不是标签正文中居中文本,我不知道。 :)
    • 啊,如果问题具有误导性,我深表歉意。很难清楚地表达我所指的内容,尤其是当 wxPython 已经破坏了诸如“窗口”之类的事物的共同含义时 :) 不过,您是对的-我是在专门询问有关对齐选项卡标题/标签中的文本的问题, 不是笔记本页面中包含的文本。显然,这并没有破坏应用程序,但是当您的标签页头比标签页的宽度短得多时,它会有点难看。
    猜你喜欢
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多