【发布时间】:2015-06-05 07:46:55
【问题描述】:
我正在练习 tkinter 和 matplotlib。
我编写了这段代码,它创建了输入的帧数,并且在每个帧中嵌入了不同的图。然后,我可以通过在创建的帧之间切换并打开绘图模式来逐个绘图。绘图模式的作用是让我点击绘图并在其上创建一条水平线。
但是当我打开绘图模式时,我只能与最后一个图表交互。
任何想法为什么会发生这种情况?
这段代码:
from tkinter import *
from random import *
import matplotlib
matplotlib.use('TkAgg')
from matplotlib import pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
numberOfFrames = eval(input('Number of frames to be crated: '))
x = []
y = []
class app(Tk):
def __init__(self):
Tk.__init__(self)
self.geometry('640x400')
self.frames = []
self.currentPage = 0
def nextpage():
try:
frame = self.frames[self.currentPage+1]
frame.tkraise()
self.currentPage += 1
except:
pass
def backpage():
if self.currentPage == 0:
pass
else:
frame = self.frames[self.currentPage-1]
frame.tkraise()
self.currentPage -= 1
def DrawOn():
def onclick(event):
plt.hlines(event.ydata,event.xdata-0.1,event.xdata+0.1,
colors='r',linestyle='solid')
canvas.show()
fig.canvas.mpl_connect('button_press_event', onclick)
for i in range(numberOfFrames):
frame = Frame(self)
frame.grid(row=0, column=0, sticky="nsew")
self.frames.append(frame)
fig = plt.figure()
for j in range(2):
x.append(randint(1,10))
y.append(randint(1,10))
plt.plot(x,y)
canvas = FigureCanvasTkAgg(fig, self.frames[i])
canvas.get_tk_widget().pack(fill='both', expand=True)
toolbar = NavigationToolbar2TkAgg(canvas, self.frames[i])
toolbar.update()
canvas._tkcanvas.pack(fill='both', expand=True)
label = Label(self.frames[i], text='Page %d'%(i+1))
label.pack()
Next = Button(self.frames[i], text='Next', command = nextpage)
Next.pack(side=LEFT)
Back = Button(self.frames[i], text='Back', command = backpage)
Back.pack(side=LEFT)
Draw = Button(self.frames[i], text='Draw', command = DrawOn)
Draw.pack(side=LEFT)
self.frames[0].tkraise()
run = app()
run.mainloop()
【问题讨论】:
-
找到了解决方案。我设法通过创建一个数字列表、一个画布列表和一个子图列表来解决它。
-
你应该看看tkinter.unpythonic.net/wiki/CallbackConfusion#line-125 在循环中创建小部件时必须小心。此外,您最好使用类方法而不是嵌套函数。嵌套函数适用于简单的情况。在这里,我将创建第二个类,其中包含一个框架、一个画布和一个子图。
-
如果您找到了解决方案,您可以将其发布为您自己问题的答案。
标签: python events python-3.x matplotlib tkinter