可以使用Python Tkinter制作自定义鼠标光标吗?(使用TkAgg后端的matplotlib)

3 投票
1 回答
5734 浏览
提问于 2025-04-15 16:51

这可能只是一个关于Python Tkinter的一般性问题,并不一定是关于matplotlib的。

我正在开发一个比较大的绘图功能,基于matplotlib,使用的是Matplotlib的“TkAgg”后端(就是把图形渲染到Tk的画布上,使用TkInter)。我在使用matplotlib自带的一些默认缩放功能,特别是默认工具栏上的“框选缩放”按钮。我正在通过继承现有的“matplotlib.backends.backend_tkagg.NavigationToolbar2TkAgg”类来创建我自己的工具栏。

问题是,我不喜欢“框选缩放”使用的默认图标(Tkinter的“tcross”)。我已经找到了如何使用不同的Tkinter内置光标(比如,这样可以把光标改成“加号”,而不是“tcross”):

import matplotlib
matplotlib.use('TkAgg')

import matplotlib.backend_bases
import matplotlib.backends.backend_tk_agg

matplotlib.backends.backend_tkagg.cursord[matplotlib.backend_bases.cursors.SELECT_REGION] = "plus"

一般来说,我知道要把当前鼠标光标改成工具栏类中的某个内置Tkinter光标,我只需要调用:

self.window.configure(cursor="cursor_name")

所以我真的非常希望在用户处于“缩放模式”时,能够使用一个放大镜图标。我已经有了想用的放大镜图标的.ppm文件,但我就是搞不懂怎么把我的放大镜图标用作鼠标光标。请问在Python Tkinter中可以使用自定义图片作为鼠标光标吗?求助!

平台说明: 这个功能需要在Mac OS X 10.5+、RedHat Enterprise Linux 5,可能还有Solaris 10上都能用,所以不希望有平台特定的解决方案。

1 个回答

3

类似这样的代码可以在Unix的X11 XBM文件中使用:

import Tkinter
t = Tkinter.Tk()
t.configure(cursor=('@/usr/include/X11/bitmaps/star', '/usr/include/X11/bitmaps/starMask', 'black', 'white'))
t.mainloop()

至于Mac电脑,根据“Tk_GetCursorFromData”的手册说明:

Mac版的Tk支持所有的X光标,同时也可以使用标准的Mac光标,比如文本光标、十字准星、等待光标、加号和箭头。此外,Tk还可以根据资源名称加载Mac的光标资源,资源类型包括crsr(彩色)和CURS(黑白)。
应用程序及其所有打开的动态库资源文件都会被搜索,以找到指定的光标。如果出现冲突,彩色光标会优先于黑白光标加载。

撰写回答