2009-06-06 8 views
2

Die bevorzugte Größe der wx.TreeCtrl scheint die minimale Größe zu sein, in die alle Elemente passen, wenn der Baum vollständig zusammengebrochen ist. Gibt es eine gute (dh Cross-Plattform-kompatible) Möglichkeit, die Breite des Baumes zu berechnen, wenn alles erweitert ist? Meine aktuelle Lösung ist dies:Was ist die richtige Methode zur Berechnung der vollständig erweiterten Breite von 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() 

Das funktioniert gut in Win32, aber nicht gut unter Linux. Gibt es eine Möglichkeit, die TreeCtrl selbst dazu zu bringen, mir ihre Größe zu nennen, damit ich die Größe, die sie meldet, überschreiben kann? (Immer die maximal erweiterte Breite zurückgeben)

bearbeiten: entschuldigen Sie mich für nicht die Funktionen, die ich oben verwenden, aber Sie bekommen die Idee, ich gehe den Baum, und die Breite von jedem Etikett, und die Rückkehr der Gesamtbreite der breitesten (unter Berücksichtigung von Einzug)

Antwort

1

Ich finde, dass die GetBestSize scheint die kollabierten Elemente zu betrachten. Zum Beispiel mit dem wxTreeCtrl in der Demo (Ubuntu und wxPython 2.8.7.1), wenn ich die Länge der inneren Textzeichenfolge ändern (Zeile 74 in meiner Version der Demo) der Rückgabewert von self.tree.GetBestSize() nimmt diese neue Länge der inneren Saite berücksichtigt, obwohl der Baum nicht ausgedehnt ist. Vielleicht müssen Sie SetQuickBestSize(False) anrufen?

+0

Ich mag diese Methode besser als manuelle Berechnung der besten Größe aus dem Baum selbst, aber es scheint nicht auf Win32 zu arbeiten. Selbst wenn ich SetQuickBestSize (False) verwende, gibt GetBestSize() einer vollständig ausgeblendeten Struktur nur die Breite des Stamms zurück. Irgendwelche anderen Ideen? – Ryan

+0

Hmm ... Ich habe es mit Win32 versucht und stimme zu, dass es nicht funktioniert. Ich denke, die Dokumente sagen nicht explizit, dass es sollte, aber es scheint wie ein Fehler, der es wert ist, gemeldet zu werden. Als Kludis könntest du folgendes tun: 'tree.ExpandAll(); tree.GetBestSize(); tree.CollapseAll() 'wenn das Betriebssystem win32 ist. – tom10

+0

Das funktioniert auch nicht! Das Problem bei Win32 scheint zu sein, dass GetBestSize nicht aufgerufen wird, wenn Sie das Steuerelement unterklassifizieren. SetMinSize scheint jedoch zu funktionieren. Auch Freeze() ing, alles erweitern, die beste Größe bekommen, und Thaw() ing hat nicht auf win32 für mich gearbeitet. Ich werde meine ultimative Lösung unten posten. Danke für die Hilfe! – Ryan

0

Dieser Code funktioniert für mich auf beide Windows und 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] 

... Und rufen compute_best_size() jedes Mal, wenn ein neues Element zu dem Baum hinzugefügt wird.