Seite 1 von 1

Baumstruktur und deren Bindungen

Verfasst: Dienstag 19. August 2003, 06:44
von Andi
Hallo zusammen,

ich hoffe mir kann bei meinem Problem einer/eine weiterhelfen.
Ich stelle innerhalb einer Canvas ein Baumstruktur dar und binde die einzelnen Element mit einer Callback Funktion. Mein Problem ist das lediglich die letzte Bindung mit <Button-1> aufgerufen wird obwohl man auf ein anderes Widget klickt.

So sieht die Methode aus welche rekursiv die Elemente in der Canvas zeichnet.

Code: Alles auswählen

   def drawTreeInstance(self,tree,node=0,actX=0):
      """ Zeichnet Baum für Instanz tree """
      if not tree:
         raise "Need Tree Instance to draw in Canvas"
      else:
         self.treeInstance=tree
         if not self.initedNodes: 
				self.reset()
				self.initedNodes+=1
         else: self.initedNodes+=1
         # Bestimme X-Koordinate
         if actX: tmpX=self.xOffset+actX
         else: tmpX=10
         # ---------------------
         tmpNodes=tree.getChildNodes(node)
         for tmpNode in tmpNodes:
            isParentNode=tmpNode.hasChildNodes()
            # Bild-Darstellung
            # Setze parent-Knoten Image (geschlossen)
            if isParentNode and self.parentNodeImage and not tmpNode.isExpanded():
               tmpId=self.create_image(tmpX,self.yPos,image=self.parentNodeImage,anchor=NW)
               self.images.append(tmpId)        
               self.tag_bind(self.images[len(self.images)-1],"<Button-1>",lambda(e): tmpNode.expand(self.redrawTreeInstance,[tree]))
            # Setze parent-Knoten Image (offen)               
            elif isParentNode and self.expandedParentNodeImage and tmpNode.isExpanded():
               tmpId=self.create_image(tmpX,self.yPos,image=self.expandedParentNodeImage,anchor=NW)               
               self.images.append(tmpId)
               self.tag_bind(self.images[len(self.images)-1],"<Button-1>",lambda(e): tmpNode.expand(self.redrawTreeInstance,[tree]))     
            # Setze blatt-Knoten Image      
            elif not isParentNode and self.nodeImage:
               tmpId=self.create_image(tmpX,self.yPos,image=self.nodeImage,anchor=NW)
               self.images.append(tmpId)
               if tmpNode.hasCallback(): self.tag_bind(self.images[len(self.images)-1],"<Double-1>",tmpNode.applyCallback)       
            # Text-Darstellung                  
            self.labels.append(self.create_text(tmpX+15,self.yPos,text=tmpNode.getLabel(),anchor=NW))
            if isParentNode:
               self.tag_bind(self.labels[len(self.labels)-1],"<Button-1>",lambda(e): tmpNode.expand(self.redrawTreeInstance,[tree]))
            elif not isParentNode and tmpNode.hasCallback():
               self.tag_bind(self.labels[len(self.labels)-1],"<Double-1>",lambda(e): tmpNode.applyCallback("self","test"))
            self.yPos+=self.yOffset
            if isParentNode and tmpNode.isExpanded():
               self.drawTreeInstance(tree,node=tmpNode,actX=tmpX)

Unter http://www.mx-solution-group.com/andi/Tree.py findet ihr das komplette Script.

Vielen Dank wenn sich einer die Mühe machen sollte und sich das mal anguckt.

mfg andi

Re: Baumstruktur und deren Bindungen

Verfasst: Dienstag 19. August 2003, 07:51
von Voges
Hallo!

Das sieht ja wirklich sehr interessant aus :!:

Wieder das leidige lambda ;-) . Versuchs mal mit

Code: Alles auswählen

            if isParentNode:
               self.tag_bind(self.labels[len(self.labels)-1],"<Button-1>",lambda e, tn=tmpNode: tn.expand(self.redrawTreeInstance,[tree]))
Vereinfacht gesagt: Alle Variablen innerhalb des lambda-Funktionsrumpfes, die sich zur Laufzeit ändern, müssen als Parameter übergeben werden. Ich weiß nicht, ob auch tree so behandelt werden muss, wenn Du z.B. mehrere Trees hast. Dafür habe ich mir den Code nicht genau genug angeguckt.

Jan

..

Verfasst: Dienstag 19. August 2003, 07:59
von Andi
ja das war es wohl.

Vielen Dank