【问题标题】:Set column width to maximum content or header width for a wx.dataview.DataViewListCtrl将列宽设置为 wx.dataview.DataViewListCtrl 的最大内容或标题宽度
【发布时间】:2020-04-29 09:16:13
【问题描述】:

我尝试设置一个 wx.dataview.DataViewListCtrl。我有多个包含文本内容的列。第一列的某些条目比选定的默认宽度更宽。他们被切断了。我可以手动设置列宽,但我喜欢将其自动设置为最大内容或标题宽度。有没有一种自动化的方法可以做到这一点?如果没有,我该如何计算理想的宽度。我在 Ubuntu Linux 上。使用的后端是 gtk。使用 wxDataViewListCtrl 的 C++ 答案也会有所帮助。我可以翻译。

【问题讨论】:

    标签: python python-3.x wxpython wxwidgets


    【解决方案1】:

    您可以通过编程了解存储在其单元格中的每个文本值的最长大小来确定列大小,并将最宽的值分配给该列宽。

    为此,您必须创建一个字体对象:

    # Example font:
    font = wx.Font(pointSize = 10, family = wx.DEFAULT, style = wx.NORMAL, weight wx.NORMAL, faceName = 'Consolas')
    
    # Get the screen display control and set the font:
    dc = wx.ScreenDC()
    dc.SetFont(font)
    
    # Gets the width and height of that text with this font:
    w,h = dc.GetTextExtent("hello world")
    

    您必须为在该列的单元格中输入的每个文本计算此值,记住所有这些值中的最大值。完成 ListView 后,您已经有了列大小的参考。

    【讨论】:

    • 还有什么要考虑的吗?例如间距。
    • 当然可以。不同的字体有不同的大小。但是如果你总是使用相同的字体,做一些测试你可以得到一个模式来计算源占用的空间。无论如何,你试过这个(Windows)吗? stackoverflow.com/questions/35771863/…(使用 ctypes)
    【解决方案2】:

    您可以将列宽设置为wxCOL_WIDTH_AUTOSIZE(在Python 中可能映射到wx.COL_WIDTH_AUTOSIZE)以使其适合其现有元素。

    【讨论】:

    • 遗憾的是这没有效果。
    • 糟糕,我没有注意到您在 Ubuntu 下,因此使用的是本机 GTK 版本的控件。由于 GTK 的限制,它确实存在一些支持 wxCOL_WIDTH_AUTOSIZE 的错误,在这种情况下,手动计算拟合宽度确实是唯一要做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2019-01-11
    • 1970-01-01
    相关资源
    最近更新 更多