Phoenix
                                
                                 Phoenix copied to clipboard
                                
                                    Phoenix copied to clipboard
                            
                            
                            
                        TreeListCtrl column width auto-size always sets small width values
Operating system: Windows 10 wxPython version: 4.1.2a1.dev5310+af8cca51 Python version: CPython 3.9.12
Description of the problem:
Using python TreeListCtrl.SetColumnWidth( col, width=wx.LIST_AUTOSIZE ) always results in very small column widths (e.g. 16) regardless of content.
This also effects TreeListCtrl.SetColumnWidth( col, width=gizmos.LIST_AUTOSIZE_CONTENT_OR_HEADER ), and effectively only auto-sizes to the column header text.
TreeListCtrl.SetColumnWidth( col, width=wx.LIST_AUTOSIZE_USEHEADER ) works as expected.
Code Example (click to expand)
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
#!============================================================================
import wx
import wx.lib.gizmos as gizmos
#!============================================================================
class Test_TreeListCtrl( gizmos.TreeListCtrl ) :
    """
    EFD Unit TreeListCtrl.
    """
    def __init__(
        self,
        parent,
        id          : int   = wx.ID_ANY,
        ) -> None :
        super().__init__( parent, id )
        columns = ( 'Name', 'AbcdefghijklmnopqrstuvwxyZ', 'A', 'Blah' )
        for col_name in columns :
            self.AddColumn( col_name )
        self.SetMainColumn( 0 )
        root = self.root = self.AddRoot("Root")
        ct_type = 1     #! checkbox
        #!--
        group1 = self.AppendItem( root, "Group 1" )
        child2 = self.AppendItem( group1, "Item 10", ct_type=ct_type )
        self.SetItemText( child2, "ABCDEFGH", 1 )
        self.SetItemText( child2, "12345678", 2 )
        child2 = self.AppendItem( group1, "Item 11", ct_type=ct_type )
        self.SetItemText( child2, "ABCDEFGH", 1 )
        self.SetItemText( child2, "12345678", 2 )
        self.Expand( group1 )
        #!--
        group2 = self.AppendItem( root, "Group 2" )
        child2 = self.AppendItem( group2, "Item 22-----------------------------------X", ct_type=ct_type )
        self.SetItemText( child2, "ABCDEFGH-----------------------------------X", 1 )
        self.SetItemText( child2, "12345678-----------------------------------X", 2 )
        child2 = self.AppendItem( group2, "Item 21", ct_type=ct_type )
        self.SetItemText( child2, "ABCDEFGH", 1 )
        self.SetItemText( child2, "12345678", 2 )
        self.Expand( group2 )
        #! NOTE: can't expand a hidden root
        if not self.HasAGWFlag(gizmos.TR_HIDE_ROOT):
            self.Expand( root )
        #! --- autosize columns ---
        for col, _ in enumerate( columns ) :
            # self.SetColumnWidth( col, width=gizmos.LIST_AUTOSIZE_CONTENT_OR_HEADER )
            self.SetColumnWidth( col, width=wx.LIST_AUTOSIZE )
            # self.SetColumnWidth( col, width=wx.LIST_AUTOSIZE_USEHEADER )
    #!------------------------------------------------------------------------
#!============================================================================
class Test_Frame(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.SetSize((400, 220))
        self.SetTitle("frame")
        self.panel_1 = wx.Panel(self, wx.ID_ANY)
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        self.test_tree_list = Test_TreeListCtrl(self.panel_1, wx.ID_ANY)
        sizer_1.Add(self.test_tree_list, 1, wx.EXPAND, 0)
        self.panel_1.SetSizer(sizer_1)
        self.Layout()
#!============================================================================
class Test_App(wx.App):
    """
    EFD Service Applicaiton class.
    """
    def OnInit(self):
        self.frame = Test_Frame(None, wx.ID_ANY, "")
        self.SetTopWindow(self.frame)
        self.frame.Show()
        return True
#!============================================================================
if __name__ == "__main__":
    app = Test_App(0)
    app.MainLoop()
GetItemWidth() seems to produce good numbers, so I assume it's something to do with traversing the child items of the tree in GetBestColumnWidth().
I reviewed the code and everything looks ok (to me).
The only thing that makes sense as to why GetBestColumnWidth() is return 10, is traversing the items is return None.
i.e. GetFirstChild() (and probalby GetNextChild()) is returning None and therefore the default of 10 max(width, 10) is being returned.
The problem is GetClientSize() is returning 16 for the width.
    def GetBestColumnWidth(self, column, parent=None):
        maxWidth, h = self.GetClientSize()
        ...
Issue also seems to be also present in wxPython v4.1.1 (unless there is something wrong in the way I've coded things in my app).
Ok, so I think it is red herring and misprogramming on my part !!
I was setting the contents of the tree in the __init__() method of my custom TreeListCtrl.  This all happens before the frame calls Layout()
If I refactor adding the contents and setting column width into a populate() method, which is called after the frame Layout(), then things work better.
One note though is that the first column DOES NOT auto-size properly - it's not quite wide enough. I presume that is due to the tree expand/collapse controls and the optional checkboxes/radio-buttons, etc.