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