如何更新嵌入到 tkinter 中的 matplotlib? [英] How to update matplotlib embedded into tkinter?

查看:34
本文介绍了如何更新嵌入到 tkinter 中的 matplotlib?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题是我想通过单击按钮来绘制绘图,但它不起作用.但是,当我从 __init__ 调用 draw 时,绘图出现在屏幕上.

The problem is that I want to draw a plot by clicking on a button but it doesn't work. However, when I call draw from __init__, the plot appears on the screen.

绘图仪.py

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure

class Plotter(FigureCanvasTkAgg):

    def __init__(self, master):

        self.figure = Figure(dpi=100)
        super().__init__(self.figure, master=master)
        self.axes = self.figure.add_subplot(111)
        self.get_tk_widget().grid(column=0, row=0, sticky='nsew')

    def draw(self):

        self.axes.clear()
        x_list = [x for x in range(0, 100)]
        y_list = [x^3 for x in x_list]
        self.axes.plot(x_list, y_list, color='y')

主应用程序.py

from tkinter import ttk 
import tkinter as tk
import plotter

class MainApplication(ttk.Frame):

    def __init__(self, master, *args, **kwargs):

        super().__init__(root)
        self.grid(column=0, row=0, sticky='nsew')

        frame = ttk.Frame(self, borderwidth=8)
        frame.grid(column=0, row=0, sticky='nsew')
        frame.rowconfigure(0, weight=1)

        notes = ttk.Notebook(frame)
        notes.grid(column=0, row=0, sticky='nsew')
        notes.rowconfigure(0, weight=1)

        page = ttk.Frame(notes)
        notes.add(page, text='Picture')


        plot = plotter.Plotter(page)
        # plot.draw() # This call updates the plot

        input_frame = ttk.Frame(self)
        input_frame.grid(column=1, row=0, sticky='nsew')

        # this binding doesn't update the plot
        button = ttk.Button(input_frame, text='Plot', \
                            command=lambda: plot.draw())
        button.grid(column=0, row=4, columnspan=2, sticky='ew')


root = tk.Tk() 
MainApplication(root)
root.mainloop()

推荐答案

就我个人而言,我会将其写在一个类中,以便我们可以使用类的属性和方法轻松控制一切.此外,您在这里不需要 lambda.只需保存对命令按钮的引用,而不是 lambda 调用.也就是说,您还覆盖了 FigureCanvasTkAggdraw 方法,因此将 draw() 方法更改为其他方法.

Personally I would write this up in a single class so that we can use class attributes and methods to control everything with ease. Also you do not need a lambda here. Just save the reference to the command button and not a lambda call. That said you were also overwriting the draw method of FigureCanvasTkAgg so change the draw() method to something else.

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import ttk 
import tkinter as tk


class MainApplication(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        notes = ttk.Notebook(self)
        notes.grid(column=0, row=0, sticky='nsew')
        notes.rowconfigure(0, weight=1)
        self.page = ttk.Frame(notes)
        notes.add(self.page, text='Picture')
        self.plotter()
        input_frame = ttk.Frame(self)
        input_frame.grid(column=1, row=0, sticky='nsew')

        button = ttk.Button(input_frame, text='Plot', command=self.new_draw)
        button.grid(column=0, row=4, columnspan=2, sticky='ew')

    def plotter(self):
        self.figure = Figure(dpi=100)
        self.plot_canvas = FigureCanvasTkAgg(self.figure, self.page)
        self.axes = self.figure.add_subplot(111)
        self.plot_canvas.get_tk_widget().grid(column=0, row=0, sticky='nsew')

    def new_draw(self):
        self.axes.clear()
        x_list = [x for x in range(0, 100)]
        y_list = [x^3 for x in x_list]
        self.axes.plot(x_list, y_list, color='y')
        self.plot_canvas.draw_idle()

MainApplication().mainloop()

这篇关于如何更新嵌入到 tkinter 中的 matplotlib?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆