使用 Tkinter 将鼠标悬停在文本上时更改文本颜色?

2024-04-18

所以我在 Tkinter 的画布上有一堆文本,我想让它在鼠标悬停在文本上时文本颜色发生变化。对于我的生活,我不知道如何做到这一点,并且似乎没有很多关于 Tkinter 的信息。

for city in Cities:
    CityText = Cities[i]
    board.create_text(CityLocs[CityText][0], CityLocs[CityText][1], text=CityText, fill="white")
    CityText = Cities[i]
    i = i + 1

这只是我将文本放置在画布上的代码,尽管我不确定还应该发布什么来表达我的观点。 Tkinter 中是否没有内置“悬停”功能或类似功能?


您可以将任意事件(鼠标、键盘、窗口管理器以及可能的其他事件)绑定到 Tkinter 中的任何小部件。

一个很好的文档位于http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm https://web.archive.org/web/20201111211515/http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm -

例如,当鼠标悬停在小部件上时将颜色更改绑定到小部件:

import Tkinter
from functools import partial

def color_config(widget, color, event):
    widget.configure(foreground=color)

parent = Tkinter.Tk()
text = Tkinter.Label(parent, text="Hello Text")
text.bind("<Enter>", partial(color_config, text, "red"))
text.bind("<Leave>", partial(color_config, text, "blue"))
text.pack()

Tkinter.mainloop()

指某东西的用途functools.partial这里允许您为文本(标签)小部件重复使用变量,因为您要将它们附加到列表中。如果您决定简单地使用 lambda,您将会得到一个令人厌恶的惊喜,因为 lambda 函数体内引用小部件的变量将始终指向它在 lambda 函数体内的最后一个值。for loop. functools.partial在调用时“冻结”变量内容,并产生一个新函数。

但是,由于您将项目放置在 Canas 中,您可以为每个项目设置“fill”和“fillactive”属性,如 @mgilson 的答案,或者您可以创建一个更通用的类,不仅可以处理悬停,还可以处理您选择稍后实施的其他事件。

如果你的班级有__call__方法,您可以将它的实例传递给bind画布上的方法,以便为画布上的每个事件调用结果对象。在这种情况下,鼠标移动事件就足够了:

from Tkinter import *

class Follower(object):
    def __init__(self,on_color="#fff", off_color="#000"):
        self.on_color = on_color
        self.off_color = off_color
        self.previous_item = None
    def hover(self, canvas, item, x, y):
        x1, y1, x2, y2 = canvas.bbox(item)
        if x1 <= x <= x2 and y1 <= y <= y2:
            return True
        return False
        
    def __call__(self, event):
        canvas = event.widget
        item = canvas.find_closest(event.x, event.y)
        hovering = self.hover(canvas, item, event.x, event.y)
        if (not hovering or item != self.previous_item) and self.previous_item is not None:
            canvas.itemconfig(self.previous_item, fill=self.off_color)
        if hovering:
            canvas.itemconfig(item, fill=self.on_color)
        self.previous_item = item

master=Tk()
canvas=Canvas(master)
canvas.pack()
canvas.create_text((40,20),text="Hello World!",fill="black")
canvas.create_text((60,80),text="FooBar",fill="black")
canvas.bind("<Motion>", Follower())
master.mainloop()

(ps.画布和文本放置示例借自@mgilson的答案)

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

使用 Tkinter 将鼠标悬停在文本上时更改文本颜色? 的相关文章

随机推荐

  • numpy.float64 不可迭代

    我正在尝试打印一个使用 numpy 数组和列表中的多个参数的函数 但我不断收到错误 numpy float 64 对象不可迭代 我在论坛上查看了关于这个主题的几个问题 并尝试了不同的答案 但似乎都不起作用 或者我可能做错了什么 我仍然是 p
  • Laravel查看路径错误

    当我更新视图文件时 我从旧路径获取视图文件 我有一个指向 IP vps 的域 我在其中安装了 laravel 让我们称之为 123 com 当我访问该域时 我会得到旧的视图路径 即我从中复制 Laravel 安装的文件夹的路径 该文件夹名为
  • 指定不同访问器中静态局部变量的构造/销毁顺序

    我遇到了崩溃cxa finalize运行一个程序 这是一个程序 而不是其中的库 ac test exe Assertion failed AcLock cpp 54 AcLock libc abi dylib terminate calle
  • 面试 - 查找数组中的幅度极点

    幅度极点 数组中左侧元素小于或等于它且右侧元素大于或等于它的元素 输入示例 3 1 4 5 9 7 6 11 期望的输出 4 5 11 我在面试中被问到这个问题 我必须返回元素的索引 并且只返回第一个满足条件的元素 My logic 取两个
  • 在 C# 中使用布尔标志来停止线程运行是否安全

    我主要关心的是布尔标志 在没有任何同步的情况下使用它是否安全 我在几个地方读到它是原子的 包括文档 class MyTask private ManualResetEvent startSignal private CountDownLat
  • 在存在 PDF iframe 的情况下选择文本后,文本输入开始向后输入

    预期的行为是什么 用户应该始终以正确的方向输入 即使他们以这种方式进行文本选择 什么地方出了错 如果我通过从右向左拖动鼠标并以 PDF iframe 结尾来选择输入 文本区域的文本 那么如果我开始键入 字符会向后插入 视频示例 https
  • 异步 servlet 不异步运行

    我有一个 servlet 它接受请求并写入长响应 响应位于使用 Thread sleep 1000 模拟长时间运行操作的循环中 我试图在这里设置一个异步请求 如代码所示 但它不起作用 当我向 servlet 调用多个请求时 它们都是连续执行
  • 在 pandas 中的列元素旁边添加数值

    这是我问的问题的进一步部分here https stackoverflow com questions 51574485 match keywords in pandas column with another list of elemen
  • 使用 HTML 输入类型文件从网络摄像头捕获摄像机录制视频

    在我的公司 我的任务是建立一个网站 用户可以在其中录制视频 这将被发送到服务器 一些事情将被完成 用户最终会收到一封电子邮件 嵌入该视频的微型网站的链接 经过一番研究 我得出的结论是 至少目前这是不可能的 在 iPad 上使用 getUse
  • typescript 参数可以注释为 const 吗?

    如果我不希望函数作用域内的参数值发生变化 有什么方法可以用 Typescript 对其进行注释吗 我试过了 function walk const fileName string string 但这不起作用 现在没有办法做到 也可能做不到
  • 应用程序崩溃后套接字仍在侦听

    我在 Windows 2008x64 上使用我的 C 应用程序之一时遇到问题 同一应用程序在 Windows 2003x64 上运行得很好 崩溃后 甚至有时在定期关闭 重新启动周期后 使用端口 82 上的套接字时会出现问题 它需要接收命令
  • 计算字符串中的常见字符 Python

    该代码的输出仍然是 4 但是 输出应该是 3 存在集合交集 因为我相信这是答案的关键 答案是 4 而不是 3 的原因来自于 s1 中与 s2 匹配的 2 个 qs 和 1 个 r 的数量 s2 qsrqq s1 qqtrr counts1
  • 未选择值的 DropDownList

    我在编辑页面内使用 DropDownListFor 辅助方法 但没有运气让它选择我指定的值 我注意到一个类似的问题 https stackoverflow com questions 1916462 dropdownlistfor in e
  • 有没有办法在 Azure DevOps Pipelines YAML 中参数化/动态设置变量组名称?

    我有一个嵌套的 Azure DevOps YAML 管道 name Some Release Pipeline trigger none variables group DEV VARIABLE GROUP This is the envi
  • 从 PHP 脚本调用节点

    我正在尝试使用 PHP 脚本调用节点脚本exec output exec usr bin node home user nodescript js nodescript js 是 var Scraper require google ima
  • Mac OSX 捆绑包的图标

    我编译了一个名为 MyBundle bundle 的 Mac OSX 捆绑包 它用作另一个应用程序的插件 我希望捆绑包有一个独特的图标 因此我将 Info plist 文件设置为
  • AspectJ 是如何工作的?

    我正在尝试了解 Aspect 的工作原理 我有 C C 背景 但魔法永远不会发生 我知道你可以用注释一些函数 Aspect然后写下Aspect的实现等等 但是 新代码是如何 以及在 什么时间 生成的 假设我没有编辑器 我使用编译java类j
  • elasticsearch中@timestamp和timestamp字段的区别

    当我使用日志存储向弹性搜索记录一些请求时 它将 timestamp 字段作为时间 当我使用 NEST 记录这些请求并设置时间戳字段时 它会放置时间戳字段 当我使用 kibana 查看数据时 这两个字段具有单独的名称 他们之间有什么区别 ti
  • 使用“-prune”时,从“find”命令中省略“-print”

    我一直无法完全理解 find 命令的 prune 操作 但实际上 至少我的一些误解源于省略 print 表达的影响 从 查找 手册页 如果表达式除 prune 之外不包含任何操作 则对表达式为 true 的所有文件执行 print 我一直
  • 使用 Tkinter 将鼠标悬停在文本上时更改文本颜色?

    所以我在 Tkinter 的画布上有一堆文本 我想让它在鼠标悬停在文本上时文本颜色发生变化 对于我的生活 我不知道如何做到这一点 并且似乎没有很多关于 Tkinter 的信息 for city in Cities CityText Citi