计算wx.TreeCtrl的完全展开宽度的正确方法是什么

时间:2009-06-06 20:44:16

标签: python wxpython size

wx.TreeCtrl的首选大小似乎是树完全折叠时所有元素都适合的最小大小。是否有一种良好的(即跨平台兼容的)方式来计算树的宽度,一切都扩展了?我目前的解决方案是:

def max_width(self):
    dc = wx.ScreenDC()
    dc.SetFont(self.GetFont())
    widths = []
    for item, depth in self.__walk_items():
        if item != self.root:
            width = dc.GetTextExtent(self.GetItemText(item))[0] + self.GetIndent()*depth
            widths.append(width)
    return max(widths) + self.GetIndent()

这在win32中效果很好,但在linux下没有用。有没有办法让TreeCtrl本身告诉我它的大小,以便我可以覆盖它报告的大小? (总是返回最大扩展宽度)

编辑:原谅我没有提供我上面使用的功能,但是你明白了,我走在树上,得到每个标签的宽度,并返回最宽的一个的总宽度(会计缩进)

2 个答案:

答案 0 :(得分:1)

我发现GetBestSize似乎考虑了折叠的项目。例如,使用演示中的wxTreeCtrl(使用Ubuntu和wxPython 2.8.7.1),当我更改内部文本字符串的长度(我的演示版本中的第74行)时,返回值{{ 1}}确实考虑了内部字符串的这个新长度,即使树未展开。也许您需要致电self.tree.GetBestSize()

答案 1 :(得分:0)

此代码适用于Windows和Linux:

def compute_best_size(self):
    if os.name == 'nt':
        best_size = (self.__max_width_win32(), -1)
    else:
        best_size = (self.__max_width(), -1)
    self.SetMinSize(best_size)

def __max_width_win32(self):
    dc = wx.ScreenDC()
    dc.SetFont(self.GetFont())
    widths = []
    for item, depth in self.__walk_items():
        if item != self.root:
            width = dc.GetTextExtent(self.GetItemText(item))[0] + self.GetIndent()*depth
            widths.append(width)
    return max(widths) + self.GetIndent()

def __max_width(self):
    self.Freeze()
    expanded = {}
    for item in self.get_items():
        if item is not self.root:
            expanded[item] = self.IsExpanded(item)
    self.ExpandAll()
    best_size = self.GetBestSize()
    for item in expanded:
        if not expanded[item]: self.Collapse(item)
    self.Thaw()
    return best_size[0]

...每次将新项目添加到树中时都会调用compute_best_size()