python - 光标在 Tkinter 中的 matplotlib Canvas 上

标签 python matplotlib tkinter

我正在使用 Tkinter 模块在 Python 上编写一个 GUI 包,并通过 FigureCanvasTkAgg 使用 matplotlib 来显示一些图形数据。我还想通过 canvas.mpl_connect 方法与数据的这种可视化表示进行交互。一切正常,但我对默认的类似箭头的光标不满意:它不允许精确点击我的数据(实际的“点击点”与箭头的尖端不匹配)并且它对用户隐藏了一些单击品脱附近的区域。所以问题是如何更改默认光标?我尝试通过 Tk 配置方法(如 master.config(cursor="tcross"))更改它,但显然 matplotlib canvas 有其自己的光标配置,因为此字符串仅更改光标在所有部分上方的外观除 MPL Canvas 外的主窗口, Canvas 上方仍显示默认箭头。

最佳答案

首先,有几个注意事项:我将深入探讨一些实现细节。我认为工具栏最近进行了重构,因此其中一些可能会随着 matplotlib 的下一版本而改变。此外,我为游标指定的值仅适用于 TkAgg后端。一般概念与其他后端类似,但 cursord 的位置并且特定于后端的游标会有所不同。以 Qt4Agg 为例, cursord字典在 backend_qt4而不是 backend_qt4agg ,值是 Qt 游标:例如QtCore.Qt.ArrowCursor .

正如我在评论中提到的,请查看 matplotlib's Cursor widget .然而,关于如何自定义 matplotlib 使用的光标的更广泛问题有点棘手。

您不能直接更改 matplotlib 使用的光标(例如 master.config(cursor='whatever') )的原因是默认工具栏会覆盖它(工具栏上不同工具的不同光标)。

一种选择是不添加工具栏。在这种情况下,您可以调用 parent.config(cursor='tcross')并完成它。但是,您可能希望显示工具栏以便于平移/缩放/等。

工具栏为每个工具使用当前光标的字典:backend_tkagg.cursord .关键是 int代码,因此通过 matplotlib.backend_bases.cursors 引用它们更具可读性。 .默认工具是 cursors.POINTER .

举个简单的例子(为简单起见,我使用 pyplot 界面来构建 Canvas 、图形等)

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

from matplotlib.backend_bases import cursors
import matplotlib.backends.backend_tkagg as tkagg

# Change the default cursor to any valid TK cursor
# To hide it, you'd use the string "none" (or possibly "no" on windows)
tkagg.cursord[cursors.POINTER] = 'coffee_mug' 

fig, ax = plt.subplots()
plt.show()

请注意,您还可以用相同的方式控制任何工具(例如缩放、平移等)的光标。您的选择是 cursor.HAND , cursor.POINTER , cursor.SELECT_REGION , 和 cursor.MOVE .

关于python - 光标在 Tkinter 中的 matplotlib Canvas 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27603215/

相关文章:

python - 了解 Python map 函数 + 范围

python - 如何从两个具有相同键值的字典创建一个 pandas 数据框?

python - Tkinter 按钮在按下时保持凹陷状态

python - Tkinter Frame 使用 super() 实例化。为什么我不能将 Label 小部件设为其子部件?

python - 按下按钮时 Tkinter GUI : Adding new entry boxes using . grid()

Python将redis对象转换为原始数据类型

python - 数值拉普拉斯变换python

python - 格式化日期时间以使用 pandas 绘制时间序列

python - matplotlib:超过 2 个控制点的延长线

python - 将像素值显示为图像