【问题标题】:Cursor over matplotlib canvas in Tkinter光标在 Tkinter 中的 matplotlib 画布上
【发布时间】:2015-02-20 14:00:04
【问题描述】:

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

【问题讨论】:

  • 没有一个完整的系统可以做到这一点,但请查看matplotlib.org/examples/widgets/cursor.html(请注意,blit 也可以在 TkAgg 上正常工作。如果您在代码中的其他地方使用 blitting,你需要担心同步事情,但这是一个单独的问题。)
  • 谢谢!这是一个非常有趣的解决方案,但是否有可能隐藏/禁用平均光标(箭头)?现在我可以看到箭头光标和这个漂亮的 MPL 光标小部件。

标签: python matplotlib tkinter


【解决方案1】:

首先,请注意几点:我将深入探讨一些实现细节。我认为工具栏最近被重构了,所以其中一些可能会随着 matplotlib 的下一个版本而改变。此外,我为游标指定的这个值仅适用于TkAgg 后端。其他后端的一般概念类似,但cursord 的位置和特定于后端的游标会有所不同。作为Qt4Agg 的示例,cursord dict 位于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 接口来构建画布、图形等)

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.HANDcursor.POINTERcursor.SELECT_REGIONcursor.MOVE

【讨论】:

  • 感谢您的详细解答!这个解决方案正是我想要的并且效果很好。一个小错误:当光标从 MPL 区域移出时,它不会变回默认形状(即一开始光标是箭头,然后,当我将它移到 MPL 区域时,它会变成 cofee_mug 或其他什么,但是当我搬出去,它仍然是杯子形状)。我发现,如果通过 config(cursor='arrow') 方法为其他小部件显式选择光标的形状,则可以修复此错误。
  • 这个问题有更新的解决方案吗? tkagg.cursord 导致属性错误:stackoverflow.com/questions/54002098/…
猜你喜欢
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 2015-07-17
相关资源
最近更新 更多