设置手形光标选择matplotlib文本

时间:2015-01-11 15:20:22

标签: python matplotlib tkinter

我在tkinter Toplevel中嵌入了matplotlib图,并使用axes.text在图中添加了文字。我将文本的picker属性设置为True,因为我想在用户点击文字时执行某些操作。现在,当鼠标移动到文本上时,我想将arrow的鼠标光标更改为hand。我知道对于tkinter的任何小部件,可以通过设置cursor='hand2'来实现。但是,似乎这是matplotlib的问题。那么,我怎样才能做到这一点?我的操作系统是Windows。感谢。

1 个答案:

答案 0 :(得分:2)

关键是要更改后端的cursord查找。 (例如,对于TkAgg,它是matplotlib.backend_tkagg.cursord。)否则,导航工具栏将覆盖您通过Tk手动指定的任何内容。

如果你需要发生什么事情,那么还有一个额外的皱纹"在悬停"。由于matplotlib没有悬停事件,因此您需要将回调连接到所有鼠标移动,然后检测您是否对相关艺术家有所了解。

此示例适用于TkAgg支持,但它与其他后端基本相同。唯一的区别在于导入和指定游标的方式(例如,在Qt上,你需要一个Qt游标对象而不是字符串"hand1")。

import matplotlib; matplotlib.use('TkAgg')

import matplotlib.pyplot as plt
import matplotlib.backends.backend_tkagg as tkagg

def main():
    fig, ax = plt.subplots()
    text = ax.text(0.5, 0.5, 'TEST', ha='center', va='center', size=25)
    fig.canvas.callbacks.connect('motion_notify_event', OnHover(text))
    plt.show()

class OnHover(object):
    def __init__(self, artist, cursor='hand1'):
        self.artist = artist
        self.cursor = cursor
        self.default_cursor = tkagg.cursord[1]
        self.fig = artist.axes.figure

    def __call__(self, event):
        inside, _ = self.artist.contains(event)
        if inside:
            tkagg.cursord[1] = self.cursor
        else:
            tkagg.cursord[1] = self.default_cursor
        self.fig.canvas.toolbar.set_cursor(1)

main()