绘制嵌入图中的hlines?

时间:2015-06-01 07:02:54

标签: python python-3.x matplotlib tkinter embed

我在这段代码中练习tkinter和matplotlib,它应该做的是将一个简单的matplotlib图嵌入到tkinter GUI中。问题是我也希望通过鼠标点击在这个嵌入图中绘制水平线,但我没有得到我想要的结果。

我得到的是,通过第一次鼠标单击,在同一图形的tkinter GUI之外创建一个新图,其中有一条水平线(点击它的位置)。如果我关闭弹出的绘图窗口并尝试再次单击嵌入的图形,则会弹出一个新的绘图,但这次它只包含一条水平线。

发生了什么事?

我正在练习的代码:

from tkinter import *
import matplotlib
matplotlib.use('TkAgg')
from matplotlib import pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure

root = Tk()

frame = Frame(root)
frame.pack()
fig = plt.figure(figsize=(16,8))
plt.plot([1,2,3],[1,2,3])
canvas = FigureCanvasTkAgg(fig, frame)
canvas.show()
canvas.get_tk_widget().pack(fill='both', expand=True)
toolbar = NavigationToolbar2TkAgg(canvas, frame)
toolbar.update()
canvas._tkcanvas.pack(fill='both', expand=True)

def pick(event):
    plt.ion()
    plt.hlines(event.ydata,event.xdata-0.009,event.xdata+0.009,colors='red',
           linestyle='solid')
fig.canvas.mpl_connect('button_press_event', pick)

1 个答案:

答案 0 :(得分:0)

不是使用plt.ion(),而是在绘制线后调用canvas.show()

此外,在matplotlib embedding in tk示例后,我不会使用pyplot,而是使用Figure(您已导入但未使用)。然后你的代码将成为:

from tkinter import *
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure

root = Tk()

frame = Frame(root)
frame.pack()
fig = Figure(figsize=(16,8))
p = fig.add_subplot(1,1,1)
p.plot([1,2,3],[1,2,3])
canvas = FigureCanvasTkAgg(fig, frame)
canvas.show()
canvas.get_tk_widget().pack(fill='both', expand=True)
toolbar = NavigationToolbar2TkAgg(canvas, frame)
toolbar.update()
canvas._tkcanvas.pack(fill='both', expand=True)

def pick(event):
    p.hlines(event.ydata, event.xdata-0.009, event.xdata+0.009,
             colors='red', linestyle='solid')
    canvas.show()

fig.canvas.mpl_connect('button_press_event', pick)

root.mainloop()