Как правильно рассчитать полностью расширенную ширину wx.TreeCtrl - PullRequest
2 голосов
/ 07 июня 2009

Предпочтительный размер 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 сообщать мне его размер, чтобы я мог переопределить размер, который он сообщает? (Всегда возвращая максимально расширенную ширину)

edit: извините за то, что я не предоставляю функции, которые я использую выше, но вы поймете, я иду по дереву, получаю ширину каждой метки и возвращаю общую ширину самой широкой ( учет отступа)

Ответы [ 2 ]

1 голос
/ 07 июня 2009

Я считаю, что GetBestSize, похоже, считает свернутые предметы. Например, с wxTreeCtrl в демо (используя Ubuntu и wxPython 2.8.7.1), когда я изменяю длину внутренней текстовой строки (строка 74 в моей версии демо), возвращается значение self.tree.GetBestSize() принять во внимание эту новую длину внутренней строки, даже если дерево не растянуто. Может быть, вам нужно позвонить SetQuickBestSize(False)?

0 голосов
/ 10 июня 2009

Этот код работает для меня как в 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() каждый раз, когда в дерево добавляется новый элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...