【问题标题】:Tkinter - canvas figure : can't bind different tag to multiple figure?Tkinter - 画布图:不能将不同的标签绑定到多个图?
【发布时间】:2016-04-02 16:58:36
【问题描述】:

我尝试在 Tkinter 画布上放置不同的图形,并为每个图形附加一个标签并绑定一个要执行的操作。

例如:我在画布上放置了 4 个点,我为它们附加了一个由它们的坐标组成的标签,并定义了一个显示点击点坐标的动作,由他的标签标识。

如果我在影响它的时候打印标签,标签不一样没关系,但是当它显示坐标时,它总是最后添加的点,似乎所有标签最终都相同......我没有理解:/

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)

有什么想法吗?

【问题讨论】:

    标签: python python-2.7 tkinter tkinter-canvas


    【解决方案1】:

    如果人们卡在同一点上,我找到了原因:

    像这样使用命令 tag_bind:

    for variable...
        canvas.tag_bind(item_id, '<ButtonPress-1>', lambda event:function(variable))
    

    永远不会在循环中工作,因为该函数将在循环完成后获取全局变量“变量”=始终是最后一个值。 您需要在命令本身中定义您的变量:

    for variable...
        canvas.tag_bind(item_id, '<ButtonPress-1>', lambda event, var=variable:function(var))
    

    这样,您的函数将为每个项目获取它自己的变量,而不是为所有项目获取一个变量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 2018-04-07
      • 1970-01-01
      • 2018-04-03
      • 2014-12-16
      • 1970-01-01
      相关资源
      最近更新 更多