【问题标题】:How to modify tags in Tkinter Canvas by events如何通过事件修改 Tkinter Canvas 中的标签
【发布时间】:2015-08-10 04:40:10
【问题描述】:

我正在以编程方式将 tag_binds 添加到画布上所有带有标签“tag”的对象:

self.canvas.tag_bind("tag","<Button 2>",self.tag_highlight)

self.canvas 包含用户添加的所有对象(所有对象都带有“tag”标签。

但是,在tag_highlight 中,我只想处理画布中的实际元素。 event.widget 似乎没有帮助,它只是 4 个浮点数的元组,我无法链接到任何画布项目。我尝试使用以下方法,但无济于事:

self.canvas.find_closest(event.x,event.y)

我想做的是有一个句柄:

t=self.canvas.getitem(event.widget)

以便我可以使用它,例如:

self.canvas.Move(t,30,20)
print self.canvas.coords(t)

等等。 也许我只是错过了显而易见的事情?

【问题讨论】:

    标签: python canvas tkinter event-handling


    【解决方案1】:

    您可以使用标签“current”,它指的是“current”对象。当前对象在official tk documentation中是这样描述的:

    标签 current 由 Tk 自动管理;它适用于 当前项目,它是绘制区域覆盖的最顶层项目 鼠标光标的位置(不同的项目类型在 不同的方式;有关详细信息,请参阅单个项目类型文档)。 如果鼠标不在画布小部件中或不在项目上,则 没有项目具有当前标签。

    【讨论】:

    • Bryan:我意识到这是一个古老的问题和答案,但在链接的 tk 文档中它说标签字符串“可以采用除整数之外的任何形式”。但是,在 Python 3.7.1 中,使用这样的标签(通过 str(intval) 创建)似乎可以正常工作。 tk 文档是过时的还是错误的?
    • @martineau:您不能使用整数的原因是当您稍后尝试使用它时,画布会将其解释为项目 ID。
    • 嗯,在事件处理方面也许确实如此,但在我自己的代码中,稍后使用它通过Canvas.itemconfig() 调用修改现有对象,它似乎可以正常工作。
    • @martineau:您可能需要仔细检查您的代码。自从 tk 被发明以来就是这样,他们非常重视向后兼容性。使用 3.7.1,我刚刚创建了一个带有整数作为标签的画布对象,无法使用该标签对其进行配置。
    • 我认为开始允许它向后兼容,因为没有人应该这样做。真的不需要太多回顾,因为代码的那些部分相对简单。我已经上传了script 的副本,如果您想查看证据——只涉及两个陈述——只需搜索str(index)
    猜你喜欢
    • 2019-05-06
    • 1970-01-01
    • 2022-12-30
    • 1970-01-01
    • 2017-07-07
    • 2016-05-28
    • 2022-01-22
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多