Search code examples
pythonpython-3.xwxpythonheightwxwidgets

How to make Titlebar height fit new Title Font size increase in WxPython?


I've increased the custon AddPrivateFont pointsize to

self.label_font.SetPointSize(27)

of the Title bar of the sample_one.py script from this shared project:

https://wiki.wxpython.org/How%20to%20add%20a%20menu%20bar%20in%20the%20title%20bar%20%28Phoenix%29

From the script of my previous question here:

https://web.archive.org/web/20221202192613/https://paste.c-net.org/HondoPrairie

AddPrivateFont to App Title / Title bar in WxPython?

My problem is I can't figure out how to make the Title bar's height larger so the Title text displays its top part correctly. Currently the top of the Title text is truncated.

I tried adjusting the height and textHeight values from this statement:

        textWidth, textHeight = gcdc.GetTextExtent(self.label)
        tposx, tposy = ((width / 2) - (textWidth / 2), (height / 1) - (textHeight / 1))

from previous ones (in the sample_one.py script):

        textWidth, textHeight = gcdc.GetTextExtent(self.label)
        tposx, tposy = ((width / 2) - (textWidth / 2), (height / 3) - (textHeight / 3))

Because it truncated the bottom (now the bottom shows up correctly but not the top of the Title text).

There is also this method I'm not sure how to handle:

    def DoGetBestSize(self):
        """
        ...
        """

        dc = wx.ClientDC(self)
        dc.SetFont(self.GetFont())

        textWidth, textHeight = dc.GetTextExtent(self.label)
        spacing = 10
        totalWidth = textWidth + (spacing)
        totalHeight = textHeight + (spacing)

        best = wx.Size(totalWidth, totalHeight)
        self.CacheBestSize(best)

        return best

I tried tweaking it and printing results but to no avail.

Here's a preview of the Truncated Title text:

Truncated Text Title Bar Title WxPython

What would be the correct approach to finding out what controls the height of the title bar object to fix the truncated title text?


Solution

  • Thanks to @Rolf of Saxony headsup I figured it out!

    It took the following 3 steps:

    1st Step:

    Top Title Text Display from:

    class MyTitleBarPnl(wx.Panel):
        def CreateCtrls(self):
            self.titleBar.SetSize((w, 54))
    
        def OnResize(self, event):
            self.titleBar.SetSize((w, 54))
    

    Top Title Text Display

    2nd Step:

    Vertical Spacing Below Title Text Without Text Display:

    class MyFrame(wx.Frame):
        def CreateCtrls(self):
            self.titleBarPnl = MyTitleBarPnl(self, -1, (w, 54))
    
        def OnResize(self, event):
            self.titleBarPnl.SetSize((w, 24))
    

    Vertical Spacing Below Title Text Without Text Display

    3rd Step:

    Vertical Spacing Below Title Text WithText Display:

    class MyFrame(wx.Frame):
        def CreateCtrls(self):
            self.titleBarPnl = MyTitleBarPnl(self, -1, (w, 54))
    
        def OnResize(self, event):
            self.titleBarPnl.SetSize((w, 54))
    

    Vertical Spacing Below Title Text With Text Display

    EDIT:

    4th Step:

    Status Bar Display:

    class MyFrame(wx.Frame):
        def CreateCtrls(self):
            self.titleBarPnl = MyTitleBarPnl(self, -1, (w, 54))
    
        def OnResize(self, event):
            self.titleBarPnl.SetSize((w, 54))
            self.mainPnl.SetSize((w, h - 55))  # 25
    

    Status Bar Display