Рисунок не обновляется с помощью matplotlib.animation - PullRequest
0 голосов
/ 11 мая 2019

Я врезался в стену и не смог найти ни одного сообщения на форуме об этой проблеме в Интернете (по крайней мере, за несколько часов поиска).

к предисловию; У меня мало знаний о Python, за исключением того, что я изучил за последние 2 месяца (медленно), кодируя это в свободное время. Приношу свои извинения, если у меня нет смысла, я еще не совсем понимаю синтаксис команд Python. Следует также отметить, что это кодируется на Raspberry Pi Model 3 B +.

Я выполнил несколько кратких действий по устранению неполадок, изменив расположение функции animate и самой фигуры внутри и снаружи класса приложения и класса Melting Point / Manual Method, но, похоже, я не могу получить его для анимации. Самое большее, я смог отобразить только одну фигуру без анимации. Следует отметить, что те же строки кода работают на предыдущей итерации приложения, но после перестановки классов рисунок больше не обновляется.

from tkinter import *
from datetime import datetime
import time
from time import sleep
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.animation as animation
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
from matplotlib import pyplot as plt 
import csv
import tkinter
import numpy as np

class SampleApp(Tk):
    def __init__(self):
        Tk.__init__(self)
        self._frame = None
        self.fullscreen = True
        self.switch_frame(MeltPoint)

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self.wm_attributes("-fullscreen", True)
        self.fullscreen = True
        self._frame = new_frame
        self._frame.grid(row=1, column=0)
        self.fst = Button(self, text="Toggle Fullscreen", command=self.fullscreen_toggle)
        self.fst.grid(row=0, column=0, rowspan=2, sticky='NW')

    def fullscreen_toggle(self):
        if self.fullscreen == False:
            self.wm_attributes("-fullscreen", True)
            self.fullscreen = True
        else:
            self.wm_attributes("-fullscreen", False)
            self.fullscreen = False

###########################################################

def animate(i):
    pullData = open("/home/pi/cpu_temp.txt","r").read()
    dataList = pullData.split('\n')
    xList = []
    yList = []
    for eachLine in dataList:
        if len(eachLine) > 1:
            x,y = eachLine.split(',')
            xList.append(float(x))
            yList.append(float(y))

    a.clear()
    a.plot(xList, yList)
    a.set_xlabel("Time[MM.SS]")
    a.set_ylabel("Temperature[°C]")

class Graph(Canvas):
    def __init__(self, master):
        Frame.__init__(self, master)            
        f = Figure(figsize=(9, 5), dpi=60)
        a = f.add_subplot(111)
        canvas = FigureCanvasTkAgg(f, self)
        canvas.draw()
        canvas.get_tk_widget().grid(row=0, column=0)
        ani = animation.FuncAnimation(f, animate, interval=100)

###########################################################


class MeltPoint(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        title = Label(self, text="Melting Point Determination").grid(row=0, column=1)       
        b1 = Button(self, height=4, width=12, text='Add Method', command=lambda: master.switch_frame(AddMethod)).grid(row=1, column=0, sticky='')
        b2 = Button(self, height=4, width=12,  text='Manual Method', command=lambda: master.switch_frame(ManMeth)).grid(row=2,column=0, sticky='')
        b3 = Button(self, height=4, width=12,  text='Recent Analysis/Results').grid(row=3,column=0, sticky='')
        b4 = Button(self, height=4, width=12,  text='Setup').grid(row=4,column=0, sticky='')
        b5 = Button(self, height=4, width=12,  text='Exit').grid(row=5,column=0, sticky='')
        tl = Frame(self, height=180, width=350, bd=1, relief=SUNKEN).grid(row=1, rowspan=3, column=1, sticky='')
###########################################################
        graph = Graph(self).grid(row=4, column=1, rowspan=3, sticky='')
###########################################################


class ManMeth(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        title = Label(self, text="Manual Method").grid(row=0, column=1)
        b1 = Button(self, height=4, width=12, text='Home', command=lambda: master.switch_frame(MeltPoint)).grid(row=1, column=0)
        b2 = Button(self, height=4, width=12,  text='Method Settings', command=lambda: master.switch_frame(AddMethod)).grid(row=2, rowspan=2, column=0)
        b3 = Button(self, height=4, width=12,  text='Start Analysis').grid(row=4,column=0)
        b4 = Button(self, height=4, width=12,  text='Data Handling').grid(row=5,column=0)
        b5 = Button(self, height=4, width=12,  text='Save Method').grid(row=6,column=0)    
        vidfrm = Frame(self, height=180, width=350, bd=1, relief=SUNKEN).grid(row=1, column=1, columnspan=2, rowspan=4)
###########################################################
        graph = Graph(self).grid(row=5, column=1, rowspan=3, sticky='')
###########################################################


if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

Я ожидаю, что график обновится из файла .txt и покажет временные и временные характеристики ЦП для отображения по осям x и y, в настоящее время отображается только статическая фигура. График также должен обновляться на обеих страницах (ручной метод и точка плавления).

1 Ответ

0 голосов
/ 13 мая 2019

Для обновления мне удалось получить график для получения оперативной информации и обновления, однако график перестает обновляться, когда вы покидаете первую страницу (и не возобновляет работу).Чтобы перейти к этому этапу, я добавил вызов функции animate в основной цикл SampleApp (), удалил фигуру из ее класса и нанес ее на график независимо (глобально? Не уверен в терминологии здесь), и, наконец, я добавил вызов canvas.get_tk_widget () для каждого класса фрейма ("окна / страницы"), являющегося MeltPoint и ManMeth.

Опять же, извините, если я усвоил терминологию Python, я все еще учусь, и я не в силах описать мои изменения!

Если кто-нибудь может мне помочь сЯ буду очень благодарен за обновление этого графика на обеих страницах!:)

from tkinter import *
from datetime import datetime
import time
from time import sleep
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.animation as animation
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
from matplotlib import pyplot as plt 
import csv
import tkinter
import numpy as np

class SampleApp(Tk):
    def __init__(self):
        Tk.__init__(self)
        self._frame = None
        self.fullscreen = True
        self.switch_frame(MeltPoint)

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self.wm_attributes("-fullscreen", True)
        self.fullscreen = True
        self._frame = new_frame
        self._frame.grid(row=1, column=0)
        self.fst = Button(self, text="Toggle Fullscreen", command=self.fullscreen_toggle)
        self.fst.grid(row=0, column=0, rowspan=2, sticky='NW')

    def fullscreen_toggle(self):
        if self.fullscreen == False:
            self.wm_attributes("-fullscreen", True)
            self.fullscreen = True
        else:
            self.wm_attributes("-fullscreen", False)
            self.fullscreen = False

###########################################################

def animate(i):
    pullData = open("/home/pi/cpu_temp.txt","r").read()
    dataList = pullData.split('\n')
    xList = []
    yList = []
    for eachLine in dataList:
        if len(eachLine) > 1:
            x,y = eachLine.split(',')
            xList.append(float(x))
            yList.append(float(y))

    a.clear()
    a.plot(xList, yList)
    a.set_xlabel("Time[MM.SS]")
    a.set_ylabel("Temperature[°C]")



f = Figure(figsize=(9, 5), dpi=60)
a = f.add_subplot(111)

###########################################################


class MeltPoint(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        title = Label(self, text="Melting Point Determination").grid(row=0, column=1)       
        b1 = Button(self, height=4, width=12, text='Add Method', command=lambda: master.switch_frame(AddMethod)).grid(row=1, column=0, sticky='')
        b2 = Button(self, height=4, width=12,  text='Manual Method', command=lambda: master.switch_frame(ManMeth)).grid(row=2,column=0, sticky='')
        b3 = Button(self, height=4, width=12,  text='Recent Analysis/Results').grid(row=3,column=0, sticky='')
        b4 = Button(self, height=4, width=12,  text='Setup').grid(row=4,column=0, sticky='')
        b5 = Button(self, height=4, width=12,  text='Exit').grid(row=5,column=0, sticky='')
        tl = Frame(self, height=180, width=350, bd=1, relief=SUNKEN).grid(row=1, rowspan=3, column=1, sticky='')

###########################################################
        canvas = FigureCanvasTkAgg(f, self)
        canvas.draw()
        canvas.get_tk_widget().grid(row=4, column=1, rowspan=3, sticky='')
###########################################################


class ManMeth(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        title = Label(self, text="Manual Method").grid(row=0, column=1)
        b1 = Button(self, height=4, width=12, text='Home', command=lambda: master.switch_frame(MeltPoint)).grid(row=1, column=0)
        b2 = Button(self, height=4, width=12,  text='Method Settings', command=lambda: master.switch_frame(AddMethod)).grid(row=2, rowspan=2, column=0)
        b3 = Button(self, height=4, width=12,  text='Start Analysis').grid(row=4,column=0)
        b4 = Button(self, height=4, width=12,  text='Data Handling').grid(row=5,column=0)
        b5 = Button(self, height=4, width=12,  text='Save Method').grid(row=6,column=0)    
        vidfrm = Frame(self, height=180, width=350, bd=1, relief=SUNKEN).grid(row=1, column=1, columnspan=2, rowspan=4)
###########################################################
        canvas = FigureCanvasTkAgg(f, self)
        canvas.draw()
        canvas.get_tk_widget().grid(row=5, column=1, rowspan=3, sticky='')
###########################################################



if __name__ == "__main__":
    app = SampleApp()
    ani = animation.FuncAnimation(f, animate, interval=100)
    app.mainloop()
...