2010-05-07 10 views
21

Si utilizo un lienzo para mostrar datos y quiero que el usuario pueda hacer clic en varios elementos del lienzo para obtener más información o interactuar con ella de alguna manera, ¿cuál es la mejor manera de hacerlo? ?¿Cómo puedo adjuntar enlaces de eventos a elementos en un lienzo usando Tkinter?

Buscando en línea Puedo encontrar información sobre cómo vincular eventos a etiquetas, pero parece ser más indirecto de lo que quiero. No quiero agrupar elementos con etiquetas, sino tener llamadas a funciones específicas cuando el usuario hace clic en elementos específicos en el lienzo.

Respuesta

50

Para interactuar con los objetos contenidos en un objeto Canvas es necesario utilizar tag_bind(), que tiene el siguiente formato: tag_bind(item, event=None, callback, add=None)

El parámetro elemento puede ser o bien una etiqueta o un id.

Aquí se muestra un ejemplo para ilustrar el concepto:

from tkinter import * 

def onObjectClick(event):     
    print('Got object click', event.x, event.y) 
    print(event.widget.find_closest(event.x, event.y)) 

root = Tk() 
canv = Canvas(root, width=100, height=100) 
obj1Id = canv.create_line(0, 30, 100, 30, width=5, tags="obj1Tag") 
obj2Id = canv.create_text(50, 70, text='Click', tags='obj2Tag') 

canv.tag_bind(obj1Id, '<ButtonPress-1>', onObjectClick)  
canv.tag_bind('obj2Tag', '<ButtonPress-1>', onObjectClick) 
print('obj1Id: ', obj1Id) 
print('obj2Id: ', obj2Id) 
canv.pack() 
root.mainloop() 
+7

Ejemplo agradable. Me gusta cómo se muestra el uso de una identificación y una etiqueta, y el uso de nombres como 'obj1Id' y' obj1Tag' para llevar el punto a casa. –

Cuestiones relacionadas