python - 在 line2D [matplotlib] 的 pick 事件中一次获取选中的行
问题描述
问题
我无法在 line2D 的 pick 事件中一次获得所有选中的行。
我正在使用 tkinter 创建交互式折线图。图中的每条线都可能相互重叠。但是,当我尝试使用 canvas 的 pick 事件来获取用户单击的多条重叠行时,会为每一行单独调用 pick 事件。如何让用户一次单击多条重叠线?
还有,虽然增加了调用pick事件的pickradius的值,但似乎并没有让pick事件的调用变得更容易。如何增加pick事件的调用范围呢?
请指教。
代码
import matplotlib.pyplot as plt
import numpy as np
import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.lines import Line2D
from tkinter import messagebox
# graph pick event
def pickLine2D(event):
print('pick evnet')
global lines
artist = event.artist
if isinstance(artist, Line2D):
if artist in lines:
idx = lines.index(artist)
print(f'line idx : {idx}')
# close window
def _windowDestroy(root):
root.quit()
root.destroy()
root = tk.Tk()
root.geometry('700x500')
root.title('graph window')
root.protocol('WM_DELETE_WINDOW', lambda root=root: _windowDestroy(root))
f = tk.Frame(root)
f.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
# data of graph
N = 2
M = 10
x = np.arange(M)
np.random.seed(seed=0)
lines = []
# set graph
fig = plt.figure(figsize=(4, 4))
cvs = FigureCanvasTkAgg(fig, f)
toolbar = NavigationToolbar2Tk(cvs, f)
cvs.get_tk_widget().pack(fill=tk.BOTH, expand=True)
# set lien2D
ax = fig.add_subplot(111)
for i in range(N):
_y = np.random.rand(M)
line = Line2D(x, _y, picker=True, pickradius=10)
lines.append(line)
ax.add_line(line)
ax.set_xlim((-0.5, M + 0.5))
ax.set_ylim((0, 1.5))
fig.canvas.mpl_connect('pick_event', pickLine2D)
root.mainloop()
环境
环境如下
- 视觉工作室代码 1.62.2
- Python 3.6.8
解决方案
推荐阅读
- python - 日期时间索引熊猫
- javascript - 如何将我的 mapDispatchToProps 连接到 onClick 道具?
- c++ - ARM MCU 中的 C++:需要帮助来设置一个简单的计时器
- javascript - JS:制作原型函数
- r - 无法分配向量,但我的环境为空
- html - 移动设备上元素之间的大空白间隙(尽管未通过检查元素移动视图出现)
- c++ - 有人可以解释这条正则表达式行的含义吗?
- sql-server - Django:迁移时“settings.DATABASES 配置不正确”,但可以通过 ORM 访问数据库
- c++ - 如何结交本地班级的功能朋友?
- python - 如何从 .vcf 文件中删除错误的制表符/新行?