Tkinter - canvas 图:不能将不同的标签绑定到多个图?
Tkinter - canvas figure : can't bind different tag to multiple figure?
我尝试在 Tkinter 上放置不同的图形 canvas,并为每个图形附加一个标签并绑定要执行的操作。
例如:我在 canvas 上放置了 4 个点,我给它们附加了一个由它们的坐标组成的标签,并定义了一个显示点击点坐标的动作,由他的标签标识。
如果我在影响它的时候打印tag,tag不一样还好,但是显示坐标的时候,总是最后添加的点,好像所有的tag最后都一样了。。。我不知道没看懂:/
from Tkinter import *
points=[(10,10),(60,10),(10,60),(60,60)]
def check(pixel):
print('===========')
print('you clicked on:')
print(pixel)
root = Tk()
canvas = Canvas(root, width=70, height=70)
print('----points list----')
for p in points:
tag="("+str(p[0])+","+str(p[1])+")"
print(tag)
canvas.create_oval(p[0]-2,p[1]-2,p[0]+2,p[1]+2,tags=tag)
canvas.tag_bind(tag, '<ButtonPress-1>', lambda event:check(tag))
canvas.pack()
root.mainloop()
可能的输出:(我点击了3个不同的点)
----points list----
(10,10)
(60,10)
(10,60)
(60,60)
===========
you clicked on:
(60,60)
===========
you clicked on:
(60,60)
===========
you clicked on:
(60,60)
有什么想法吗?
我找到了原因,如果人们卡在同一个点上:
像这样使用命令 tag_bind:
for variable...
canvas.tag_bind(item_id, '<ButtonPress-1>', lambda event:function(variable))
永远不会在循环中工作,因为该函数将在循环结束后获取全局变量 'variable' = 始终是最后一个值。
您需要在命令本身中定义您的变量:
for variable...
canvas.tag_bind(item_id, '<ButtonPress-1>', lambda event, var=variable:function(var))
像这样,您的函数将为每个项目获得自己的变量,而不是为所有项目获得一个变量
我尝试在 Tkinter 上放置不同的图形 canvas,并为每个图形附加一个标签并绑定要执行的操作。
例如:我在 canvas 上放置了 4 个点,我给它们附加了一个由它们的坐标组成的标签,并定义了一个显示点击点坐标的动作,由他的标签标识。
如果我在影响它的时候打印tag,tag不一样还好,但是显示坐标的时候,总是最后添加的点,好像所有的tag最后都一样了。。。我不知道没看懂:/
from Tkinter import *
points=[(10,10),(60,10),(10,60),(60,60)]
def check(pixel):
print('===========')
print('you clicked on:')
print(pixel)
root = Tk()
canvas = Canvas(root, width=70, height=70)
print('----points list----')
for p in points:
tag="("+str(p[0])+","+str(p[1])+")"
print(tag)
canvas.create_oval(p[0]-2,p[1]-2,p[0]+2,p[1]+2,tags=tag)
canvas.tag_bind(tag, '<ButtonPress-1>', lambda event:check(tag))
canvas.pack()
root.mainloop()
可能的输出:(我点击了3个不同的点)
----points list----
(10,10)
(60,10)
(10,60)
(60,60)
===========
you clicked on:
(60,60)
===========
you clicked on:
(60,60)
===========
you clicked on:
(60,60)
有什么想法吗?
我找到了原因,如果人们卡在同一个点上:
像这样使用命令 tag_bind:
for variable...
canvas.tag_bind(item_id, '<ButtonPress-1>', lambda event:function(variable))
永远不会在循环中工作,因为该函数将在循环结束后获取全局变量 'variable' = 始终是最后一个值。 您需要在命令本身中定义您的变量:
for variable...
canvas.tag_bind(item_id, '<ButtonPress-1>', lambda event, var=variable:function(var))
像这样,您的函数将为每个项目获得自己的变量,而不是为所有项目获得一个变量