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本身告诉我它的大小,以便我可以覆盖它报告的大小? (总是返回最大扩展宽度)
编辑:原谅我没有提供我上面使用的功能,但是你明白了,我走在树上,得到每个标签的宽度,并返回最宽的一个的总宽度(会计缩进)
答案 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()
。