对 Tkinter bind_class 感到困惑

2023-12-05

我定义了 GCanvas,Canvas 的扩展。我的目的是在类级别绑定到 GCanvas。它不起作用。

我还尝试绑定到 tk.Canvas,但它也不起作用。绑定到root或 GCanvas 实例工作正常。 (这两种选择对我来说都没有用,但我只是尝试了一下看看发生了什么。)。运行 OS X、El Capitan。

import Tkinter as tk

class GCanvas(tk.Canvas, object):

    def __init__(self, master, **kwargs):
        tk.Canvas.__init__(self, master, kwargs)

    @staticmethod
    def enter(e):
        print "enter", e.widget, e.x, e.y

    @staticmethod
    def leave(e):
        print "leave", e.widget

    @staticmethod
    def motion(e):
        print "motion", e.widget, e.x, e.y

approach = "bindinstance"

root = tk.Tk()
gc = GCanvas(root, width=400, height=300)
print "root is", root, "gc is", gc
gc.pack()

if approach == "bindGCanvas":
    print "binding to GCanvas"
    root.bind_class(GCanvas, '<Enter>', GCanvas.enter)
    root.bind_class(GCanvas, '<Leave>', GCanvas.leave)
    #root.bind_class(GCanvas, '<Motion>', GCanvas.motion)
elif approach == "bindCanvas":
    print "binding to Canvas"
    root.bind_class(tk.Canvas, '<Enter>', GCanvas.enter)
    root.bind_class(tk.Canvas, '<Leave>', GCanvas.leave)
    #root.bind_class(tk.Canvas, '<Motion>', GCanvas.motion)
elif approach == "bindinstance":
    print "binding to instance"
    gc.bind('<Enter>', GCanvas.enter)
    gc.bind('<Leave>', GCanvas.leave)
    #gc.bind('<Motion>', GCanvas.motion)
else:
    print "binding to root"
    root.bind('<Enter>', GCanvas.enter)
    root.bind('<Leave>', GCanvas.leave)
    #root.bind('<Motion>', GCanvas.motion)

root.mainloop()

中的“类”bind_class指tk库使用的内部类名,而不是python类名。更准确地说,在这种情况下,它指的是bind tag,它恰好与 tk 类同名,也恰好与核心 Tkinter 类之一同名(例如:Toplevel, Canvas, etc).

绑定到GCanvas在类级别,最简单的事情是添加一个名为的绑定标签GCanvas到您的画布,如下例所示:

class GCanvas(tk.Canvas, object):
    def __init__(self, master, **kwargs):
        ...
        # get the current bind tags
        bindtags = list(self.bindtags())

        # add our custom bind tag before the Canvas bind tag
        index = bindtags.index("Canvas")
        bindtags.insert(index, "GCanvas")

        # save the bind tags back to the widget
        self.bindtags(tuple(bindtags))

然后您可以使用bind_class像这样:

root.bind_class("GCanvas", "<Enter>", GCanvas.enter)
root.bind_class("GCanvas", "<Leave>", GCanvas.leave)

有关绑定标签的更多信息,请参阅以下一些其他 tkinter 问题的答案:

  • https://stackoverflow.com/a/11542200/7432
  • https://stackoverflow.com/a/3513906/7432
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对 Tkinter bind_class 感到困惑 的相关文章

随机推荐

  • 使用 python 反向模板

    我有一个文件 充满了某种格式的数据 我想用该数据填充我自己的数据结构 例如 我可以有一个这样的文件 John Smith 0123 children Sam Kim 我想用该字符串做一些事情 以便将数据提取到例如 firstName Joh
  • Outlook 根据类别自动更改提醒

    我需要自动化 Outlook 以便当用户在约会上设置特定类别时 它会根据该类别自动设置提醒时间 例如 用户具有 现场会议 类别和 场外会议 类别 他希望现场会议的提醒时间自动更改为 15 分钟 场外会议的提醒时间自动更改为 30 分钟 他明
  • 如何使用 Object 参数对 Arraylist 中的对象进行排序

    我在对 Arraylist 中的对象进行排序时遇到问题 因为我是排序对象的新手 对数组列表进行排序非常基本 但对对象的数组列表进行排序是完全不同的事情 基本上 我一直在堆栈溢出中查看代码 人们似乎使用比较器来解决他们的问题 但他们没有解释如
  • XCode 无法构建 Unity3D 项目:找不到 lib

    我有 Unity3D 项目 我为 iOS 构建了它 如果我使用 XCode 的模拟器运行它 它工作得很好 但是 如果我想为 iOS 设备 或连接到我的 Mac 的物理设备编译它 我会遇到很多错误 因此我无法创建存档 出于测试目的 我什至创建
  • 如何使用php将GPS坐标转换为完整地址? [复制]

    这个问题在这里已经有答案了 我的 GPS 坐标格式为54 1456123 10 413456 如何使用 PHP 将它们转换为包含邮政编码 街道和城市的地址 使用谷歌API lat 54 1456123 long 10 413456 url
  • Python for 循环跳过所有其他值

    我在 django 应用程序中遇到了一个奇怪的问题 其中 for 循环跳过了所有其他项目 我已经获取了返回的查询集并且list ed 进行迭代 这样做的目的是删除另一个列表中的项目 该列表通过 POST 变量传递到视图 该视图是一个ajax
  • 如何在 Windows Phone 中使用 Bing 搜索 API?

    我正在尝试使用 Bing 搜索 API 查找图像作为应用程序内图块的背景 我已将 BingSearchContainer cs 包含在我的项目中 但无法使其与此处提供的示例代码一起使用 有关如何在我的 Windows Phone 8 应用程
  • 有时读取 ImportXML 单元格时,.getValue() 返回 #N/A

    我编写了一个脚本 将 ImportXML 公式写入单元格 然后几秒钟后尝试读取单元格并将其替换为它的返回值 问题是当我用获取的值替换单元格时 我经常 但并非总是 得到 N A 问题是 我能够在短时间内看到正确的值 因此 ImportXML
  • Docker 中 Bcrypt 安装失败

    我使用 MongoDB 创建了一个在 Docker 中运行的节点应用程序 它工作得很好 直到我包括在内节点 bcrypt js 这使得 Node 崩溃node gyp and bcrypt 该应用程序在本地和 Heroku 上运行良好 我尝
  • CardLayout,通过ButtonClick在JPanel之间切换

    我想通过单击 JPanel 上的按钮在 JPanel 之间切换 例如 我有一个带有 JButton simknop 的 JPanel sim 和一个带有 JButton helpknop 的 JPanel 帮助 我想通过单击按钮在这 2 个
  • PaintEvent 中警告 QPainter [重复]

    这个问题在这里已经有答案了 我尝试在 QChartView 中绘制更多信息 因此我重新实现了paintEvent virtual void paintEvent QPaintEvent event QChartView paintEvent
  • 当 Coq 中使用自己的可判定性时,评估计算不完整

    The Eval compute命令并不总是计算为简单表达式 考虑代码 Require Import Coq Lists List Require Import Coq Arith Peano dec Import ListNotation
  • 为什么用逗号进行双重初始化是非法的?

    我有三个代码片段 这个 1 7 yes that s all the code 编译没问题 这个 double d 1 7 也编译没问题 然而这个 double d 1 7 编译失败 gcc 4 3 4 说 错误 在数字常量之前预期有不合格
  • 调用 webapi 抛出 No Access-Control-Allow-Origin 标头出现在请求的资源上

    我正在尝试按照 Azure 示例通过此处提供的 WSFederation 将 Azure AD 集成到我的 MVC 4 6 Web 应用程序中https github com Azure Samples active directory d
  • Python 按值搜索

    我需要一个合适的解决方案来搜索 Python 嵌套数据结构中的键 假设我有一个带有值 check 的变量和这样的字典 SERVICES domain check whois register user create show delete
  • NoClassDefFoundError:com.opencsv.CSVWriter

    我尝试使用 opencsv libray 来获取加密格式数据 但在 CSV writer 上写入时 我收到 NoClassDefFoundError 我看过很多与相同错误相关的帖子 并尝试了几乎所有方法 但仍然无法纠正问题 下面的链接有同样
  • 现在如何使用 Blaze 在 Meteor 模板中的动态字段上使用 X-editable?

    I had x 可编辑在 Meteor 0 7 2 中工作 但自从升级到 0 8 0 后 它不再正确渲染 我往往会得到一堆空标签 这很令人沮丧 因为数据就在那里 只是在渲染函数被触发时还没有
  • 使服务层可以访问对象,而无需在 MVC4 应用程序中作为参数传递

    我正在构建一个多租户 MVC 应用程序 其中有一个应用程序池和一个数据库 我有一个租户表 并且我的每个模型都有一个标识的 TenantId 每个租户都有一个字符串 Url 用于标识用于访问该租户数据的完整 URL 我可以通过以下方式从 Ba
  • 如何对列表重新排序? [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 给定一个任意大小的数组n 我想根据数组的离散索引重新组织数组的元素 Python 示例 Unique array of size n a b c d e
  • 对 Tkinter bind_class 感到困惑

    我定义了 GCanvas Canvas 的扩展 我的目的是在类级别绑定到 GCanvas 它不起作用 我还尝试绑定到 tk Canvas 但它也不起作用 绑定到root或 GCanvas 实例工作正常 这两种选择对我来说都没有用 但我只是尝