Baumstruktur und deren Bindungen

Fragen zu Tkinter.
Antworten
Andi
User
Beiträge: 24
Registriert: Sonntag 27. Juli 2003, 14:23
Wohnort: Großkarolinenfeld

Dienstag 19. August 2003, 06:44

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
mfg

(der Anderl aus Bavaria der bei den Preißn war und jetzt wieda in bayern is)
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Dienstag 19. August 2003, 07:51

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
Andi
User
Beiträge: 24
Registriert: Sonntag 27. Juli 2003, 14:23
Wohnort: Großkarolinenfeld

Dienstag 19. August 2003, 07:59

ja das war es wohl.

Vielen Dank
mfg

(der Anderl aus Bavaria der bei den Preißn war und jetzt wieda in bayern is)
Antworten