【问题标题】:Can interact only with the last graph只能与最后一个图交互
【发布时间】: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()

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 2016-10-03
    • 2017-10-03
    • 2012-01-23
    相关资源
    最近更新 更多