Python matplotlib tkinter - кнопка не обновляет график - PullRequest
1 голос
/ 27 февраля 2020

Я пишу небольшую программу с намерением периодически обновлять графики matplotlib. Для этого я намерен использовать clear () и перерисовать график. Функция clear работает при вызове из метода, который создает график, но не работает при вызове с кнопки, даже если график задан как параметр.

Ниже приведен исполняемый код в его основной форме c для иллюстрации проблемы. В этом случае нажатие кнопки «Обновить» ничего не дает. Как бы я исправить эту кнопку, чтобы очистить график?

import matplotlib.pyplot as plt 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk
import numpy as np

class MainWindow(tk.Frame):
    def __init__(self, master = None):
        tk.Frame.__init__(self, master)
        self.add_graph()

    def add_graph(self):         
        fig_sig = plt.figure(figsize=(4,2))
        graph = fig_sig.add_subplot(111)
        y_values = [0,1,2,3,4,5]   
        x_values = [1,2,3,4,5,6]
        graph.plot(x_values, y_values)
        canvas = FigureCanvasTkAgg(fig_sig, master=root)
        canvas_widget=canvas.get_tk_widget()   
        canvas_widget.grid(row = 1, column = 0, columnspan = 3)
        canvas.draw()
        self.add_widgets(root, graph)
        #graph.clear()  # Calling graph.clear() here does clear the graph

    def add_widgets(self, parent, graph):
        update_btn = tk.Button(parent, text = "Update", command = lambda: self.update_graph(graph))
        update_btn.grid(row = 8, column = 3)

    def update_graph(self, graph):
        graph.clear()   # calling graph.clear() here does nothing

root = tk.Tk()
oberflaeche = MainWindow(master = root)
oberflaeche.mainloop()   

1 Ответ

2 голосов
/ 27 февраля 2020

вам необходимо «обновить» холст в этом случае.

определить ваш холст как: self.canvas = FigureCanvasTkAgg(fig_sig, master=root)

и «обновить» его:

def update_graph(self, graph):
    graph.clear()   # calling graph.clear() here does nothing
    self.canvas.draw()
...