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