Как обновить полный график через 5 секунд, используя matplotlib и tkinter? - PullRequest
0 голосов
/ 31 мая 2018

Что должен делать этот код: Рисовать данные, используя функцию get_latest_data (1) с параметром № 1, и через 5 секунд перерисовывать данные, используя функцию get_latest_data (2) с параметром № 2

Что этот код уже делает: Нарисуйте данные, используя функцию get_latest_data (1) с параметром номер 1

Это полуфункциональный код (работает только при первом рисовании диаграммы)

from threading import Thread
from queue import Empty, Queue
import time
import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg#, NavigationToolbar2TkAgg
from matplotlib.figure import Figure

class tkChartGUI(tk.Frame):


    def __init__(self, parent):
        tk.Frame.__init__(self, parent)   
        self.parent = parent
        self.initUI()

    def get_latest_data(self, dataid):
        x_array=[]
        y_array=[]
        if (dataid == 1):
            x_array=[1,2,3,4,5,6,7,8,9,10,11,12,13,14];
            y_array=[0.5,0.7,0.3,1.0,0.6,0.9,0.5,0.2,0.1,0.5,0.33,0.55,0.3,0.6] 
        if (dataid == 2):
            x_array=[1,2,3,4,5,6,7,8,9,10,11,12,13,14];
            y_array=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.1,1.2,1.3] 
        return (x_array, y_array)


    def initUI(self):
        self.parent.title("Simple chart")
        self.parent.geometry("800x600+300+100")

        result_queue = Queue()
        Thread(target=self.get_latest_data, args=[result_queue], daemon=True).start()

        x_array, y_array = self.get_latest_data(1)

        f = Figure(figsize=(5, 3), dpi=150)        
        a = f.add_subplot(111)
        a.set_xlabel("Values_X")
        a.set_ylabel("Values_Y")
        a.yaxis.grid(True, which='major')
        a.xaxis.grid(True, which='major')
        a.plot(x_array, y_array)

        canvas = FigureCanvasTkAgg(f, master=self.parent)
        canvas.show()                        
        canvas.get_tk_widget().grid(row=0,column=0)

        def display_result(a, q):
            x_array = []
            y_array = []
            try:                
                x_array = q.get(block=False) # get data
                y_array = q.get(block=False)                           

            except Empty:
                #a.clear()                            
                timeout_millis = round(100 - (5000 * time.time()) % 100)
                self.parent.after(timeout_millis, display_result, a, q)
            a.plot(x_array, y_array)
            canvas.draw()      

        def get_result(q):
            x_array, y_array = self.get_latest_data(2)
            q.put(x_array) # put data in FIFO queue x coords array
            q.put(y_array) # put data in FIFO queue y coords array

        display_result(a, result_queue)


    def onExit(self):
        self.quit()

def main():
    root = tk.Tk()
    my_gui = tkChartGUI(root) 
    root.mainloop()

if __name__ == '__main__':
    main()        

Result of what this code do already

1 Ответ

0 голосов
/ 31 мая 2018

Чтобы запустить функцию get_latest_data() через пять секунд, выполните следующие действия:

root.after(5000, get_latest_data)

root.ater: функция tkinter для выполнения функции через некоторое время.

5000: 5000 миллисекунд, то есть 5 секунд.

get_latest_data: функция, которую мы вызываем без скобок .Чтобы передать ему аргументы, используйте lambda, например:

root.after(5000, lambda:get_latest_data(variable) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...