LINUX.ORG.RU

помогите исправить проблему(не добавляется в очередь функция с параметром) в скрипте на Python с matplotlib

 , , ,


0

2

Смысл такой: нарисовать график при помощи get_latest_data(1) и через 5 секунд поменять его на данные из get_latest_data(2)

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)                           
                a.plot(x_array, y_array)
                canvas.draw() 
            except Empty:
                #a.clear()                            
                timeout_millis = round(100 - (5000 * time.time()) % 100)
                self.parent.after(timeout_millis, display_result, a, q)
                 
                
        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()
★★★★★

Последнее исправление: sniper21 (всего исправлений: 1)

Легко. Судя по количеству звезд, читать ты умеешь и просто не выспался. Поэтому прописываю тебе десять часов сна, спокойную установку любимого дистрибутива линукс для расслабления, и, затем беглый взгляд на

  File "C:\Users\chart_s\main.py", line 57, in display_result
    a.plot(x_array, y_array)
UnboundLocalError: local variable 'x_array' referenced before assignment
t184256 ★★★★★
()
Ответ на: комментарий от t184256

Исправил

def display_result(a, q):
    x_array =[]
    y_array=[]
    try:
        a.clear()
        x_array = q.get(block=False) # get data
        x_array = q.get(block=False)  
    except Empty:
        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()    

Но ничего не рисует...

sniper21 ★★★★★
() автор топика
Ответ на: комментарий от sniper21

Естественно, чего это вдруг a.plot([], []) ничего не рисует? Давай-ка не пропускай пункты.

t184256 ★★★★★
()
Ответ на: комментарий от Revent

так, теперь рисует, но только первый график. Но проблема другая - не меняет на второй набор данных после прохождения 5 секунд.

sniper21 ★★★★★
() автор топика
Последнее исправление: sniper21 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.