2

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 本身告诉我它的大小,以便我可以覆盖它报告的大小?(总是返回最大扩展宽度)

编辑:请原谅我没有提供我上面使用的功能,但你明白了,我正在走树,获取每个标签的宽度,并返回最宽标签的总宽度(考虑缩进)

4

2 回答 2

1

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

于 2009-06-07T01:11:04.660 回答
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()每次将新项目添加到树时调用。

于 2009-06-10T13:32:11.383 回答