如何在 Tkinter 中通过一个“绑定”绑定多个小部件?

2024-03-08

我想知道如何用一个“绑定”绑定多个小部件。

例如:

我有三个按钮,我想在悬停后更改它们的颜色。

from Tkinter import *

def SetColor(event):
    event.widget.config(bg="red")
    return

def ReturnColor(event):
    event.widget.config(bg="white")
    return

root = Tk()

B1 = Button(root,text="Button 1", bg="white")
B1.pack()

B2 = Button(root, text="Button2", bg="white")
B2.pack()

B3 = Button(root, text= "Button 3", bg="white")
B3.pack()

B1.bind("<Enter>",SetColor)
B2.bind("<Enter>",SetColor)
B3.bind("<Enter>",SetColor)

B1.bind("<Leave>",ReturnColor)
B2.bind("<Leave>",ReturnColor)
B3.bind("<Leave>",ReturnColor)

root.mainloop()

我的目标是只有两个绑定(用于“进入”和“离开”事件),而不是上面的六个。

谢谢你的任何想法


要回答有关是否可以将单个绑定应用于多个小部件的具体问题,答案是肯定的。它可能会导致更多的代码行而不是更少,但它很容易做到。

所有 tkinter 小部件都有称为“bindtags”的东西。绑定标签是绑定所附加的“标签”列表。你一直在使用它而不自知。当您绑定到小部件时,绑定实际上不在小部件本身上,而是在与小部件的低级别名称同名的标签上。默认绑定位于与小部件类(底层类,不一定是 python 类)同名的标签上。当你打电话时bind_all,您正在绑定到标签"all".

Bindtags 的伟大之处在于您可以添加和删除您想要的所有标签。因此,您可以添加自己的标签,然后将绑定分配给它bind_class(我不知道为什么 Tkinter 作者选择这个名字......)。

要记住的重要一点是,绑定标签有一个顺序,并且事件按此顺序处理。如果事件处理程序返回字符串"break",在检查任何剩余的绑定标签的绑定之前,事件处理停止。

这样做的实际结果是,如果您希望其他绑定能够覆盖这些新绑定,请将您的绑定标签添加到末尾。如果您希望您的绑定不可能被其他绑定覆盖,请将其放在开头。

Example

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)

        # add bindings to a new tag that we're going to be using
        self.bind_class("mytag", "<Enter>", self.on_enter)
        self.bind_class("mytag", "<Leave>", self.on_leave)

        # create some widgets and give them this tag
        for i in range(5):
            l = tk.Label(self, text="Button #%s" % i, background="white")
            l.pack(side="top")
            new_tags = l.bindtags() + ("mytag",)
            l.bindtags(new_tags)

    def on_enter(self, event):
        event.widget.configure(background="bisque")

    def on_leave(self, event):
        event.widget.configure(background="white")

if __name__ == "__main__":
    root = tk.Tk()
    view = Example()
    view.pack(side="top", fill="both", expand=True)
    root.mainloop()

有关绑定标签的更多信息可以在此答案中找到:https://stackoverflow.com/a/11542200/7432 https://stackoverflow.com/a/11542200/7432

另外,bindtags方法本身记录在 effbot 上基本的小部件方法 http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.bindtags-method页面等其他地方。

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

如何在 Tkinter 中通过一个“绑定”绑定多个小部件? 的相关文章

随机推荐

  • JQuery:复选框如何在选择另一个复选框时选中或取消选中所有复选框[重复]

    这个问题在这里已经有答案了 当我选择 取消选择 全选 复选框时 我希望选中或取消选中所有其他复选框 没有子元素或父元素 网页代码 div li class input li div
  • 地图 v2 标记动画 - 淡入和淡出

    如何淡入淡出谷歌地图 http developer android com reference com google android gms maps GoogleMap html marker http developer android
  • 如何在R中按分组列求和?

    这是我的输入 一个包含 n 列的数据框 以及一个将每个 id 分配给一个组的辅助数据框 df lt data frame a1 c 1 2 3 a2 c 2 3 4 b1 c 4 5 6 b2 c 5 6 7 aux lt data fra
  • iOS 4:FigCreateCGImageFromJPEG 返回 -1

    我试图在我的应用程序中运行基本的图像选择器 照片拍摄器 但遇到了以下错误 ERROR FigCreateCGImageFromJPEG returned 1 Input null was 551120 bytes 我显示了图像选择器 相机视
  • 我们如何在 CQ5 中定义全局属性

    我的要求是拥有一个具有可创作属性的全局页眉和页脚 因此 如果我们更新一页上的属性 它应该会反映在所有页面上 在 CQ5 中实现这一目标的最佳方法是什么 ACS AEM Commons 现在支持此功能 无需使用 iparsys 共享组件属性
  • 在没有可用干净版本的情况下清理被黑网站的最佳方法?

    我被要求fix在生产服务器上使用 osCommerce 构建的被黑网站 该站点始终存在于远程主机上 没有离线的clean版本 让我们暂时忘记这有多么愚蠢 并处理它的本质 它已被黑客攻击多次 并且另一个人fixed通过删除 Web shell
  • 无法使用 localhost 连接手机上运行的 Android 应用程序

    我正在使用 GCM 制作 Android 应用程序 我正在尝试通过在手机上运行的应用程序进行注册 输入无法使用 php 存储在本地主机 XAMPP 上 我的手机和笔记本电脑在同一网络上运行 localhost 的 IP 地址有问题 我使用这
  • 当返回类型为标记接口时使用 Jackson 进行多态序列化

    我有一个返回标记接口的休息服务 并且该接口有多个实现 并且在实现中没有任何公共属性 RequestMapping value users userName method RequestMethod GET public User getUs
  • 为什么初始化器列表中的自初始化引用不是错误?

    我遇到了一个奇怪的问题 如果我尝试编译自赋值对象引用 我的编译器 针对 ESP32 不会显示任何错误或警告 我调查了这个问题 发现某些编译器不会显示此代码的任何错误或警告 include
  • 有没有办法反序列化 Elasticsearch Nest 搜索查询?

    使用 Nest 构建 Elasticsearch 查询后 我希望能够查看发送到 Elasticsearch 的 JSON 版本 这可能吗 我想是某种解串器 这是我的后续问题的信息 infer defaultIndex myindex ack
  • 为什么 Android 对 ConstraintLayout 使用单独的 xmlns

    我对 Android 中的 ConstraintLayout 有点困惑 我正在学习它 首先我感到困惑的是为什么 android 使用单独的 xml 命名空间呢 xmlns app http schemas android com apk r
  • 使用 IIS 和 ACL 的 WCF 授权

    我正在尝试保护一些 WCF 服务 如果可能的话 我想使用 IIS 或 Web config 来完成所有繁重的工作 配置 我不想在我的代码中嵌入任何东西 我想我知道这可能不可行 如果可能的话 我想实现这一点而不必求助于 AspCompatib
  • 不透明度低于 childs 的容器

    我想制作我的网页background color with opacity 0 5但网页内的内容会有一个opacity 1 作为默认值 问题是如果我设置opacity 0 5对于容器 该容器内的所有子级都相同opacity value 我搜
  • 关于如何使用R和ggplot2绘制背对背图的问题

    我的目标是绘制一个金字塔图 如所附的那样 我找到了几个使用 ggplot 的示例 但我仍然在努力将我的示例应用于我的数据 或我想要绘制的数据 structure list serial c 40051004 16160610 1609031
  • Centos 无法安装 mysqli

    我无法安装Mysqli 我正在使用 Centos 6 apache 2 2 x 和 php 5 4 MySql 5 5 37 cll I tried yum install php pdo php mysqli 我看到 Loaded plu
  • 使用批处理文件发送电子邮件

    我的 Outlook 配置了我的办公室 ID 并且对批处理脚本非常陌生 通过批处理文件向我的同事发送电子邮件的最简单的方法 最简单的代码 是什么 thanks 我可以为你看到 3 个选项 最重要的是 批处理没有内置方法 但有可以从批处理文件
  • 检查优惠券是否应用于 WooCommerce 中的购物车

    我需要找到一种方法来检查优惠券是否适用于 WooCommerce 结帐 如果是这样 我想做点什么 我尝试四处寻找这个问题 但找不到解决方案 这是我正在尝试的精简版本 add action woocommerce before cart ta
  • 自定义 Clipper 贝塞尔曲线 Flutter

    我目前无法绘制贝塞尔曲线 The output I have right now is The output that I need is 我应该在此处添加什么作为贝塞尔值来获得曲线 自定义剪辑器的代码片段是 class OnBoardin
  • 链接到电子邮件附件

    您好 我正在发送电子邮件附件 使用 php 并想向我向其发送电子邮件的人指出有附件 我想通过在电子邮件的 html 正文中显示一个链接来实现此目的 因此他们所需要做的就是单击该链接 系统将尝试打开 查看附件 有谁知道这是否可能 如果是这样
  • 如何在 Tkinter 中通过一个“绑定”绑定多个小部件?

    我想知道如何用一个 绑定 绑定多个小部件 例如 我有三个按钮 我想在悬停后更改它们的颜色 from Tkinter import def SetColor event event widget config bg red return de