只能与最后一个图表进行交互

时间:2015-06-05 07:46:56

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

我正在练习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()

1 个答案:

答案 0 :(得分:0)

这是我对我的代码所做的改动。它使得与所有嵌入图形交互成为可能。我不确定这是否是最佳方式,但似乎有效。

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
        self.figs = []
        self.axeslist = []
        self.canvaslist = []

        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):

                self.axeslist[self.currentPage].hlines(event.ydata,event.xdata-0.1,event.xdata+0.1,
                                                   colors='r',linestyle='solid')      
                self.canvaslist[self.currentPage].show()
                print(event.xdata,event.ydata)

            for i in self.figs:
                i.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()
            self.figs.append(fig)
            ax = self.figs[i].add_subplot(111)
            self.axeslist.append(ax)

            for j in range(2):
                x.append(randint(1,10))
                y.append(randint(1,10))

            plt.plot(x,y)
            canvas1 = FigureCanvasTkAgg(self.figs[i], self.frames[i])
            self.canvaslist.append(canvas1)
            self.canvaslist[i].get_tk_widget().pack(fill='both', expand=True)
            toolbar = NavigationToolbar2TkAgg(self.canvaslist[i], self.frames[i])
            toolbar.update()
            self.canvaslist[i]._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()