сюжет Python в реальном времени в окне Tkinter - PullRequest
0 голосов
/ 03 марта 2019

Я хочу построить дату датчика на графике, основанном на времени, который должен быть встроен в окно Tkinter.На данный момент я только хочу построить график y1List против xList.

До сих пор я не нашел решения по стеку для моего конкретного случая использования.

Мой код:

import datetime                 # für Datum/Uhrzeit
from tkinter import *           # für GUI
import numpy as np
import matplotlib as mpl
import matplotlib.backends.tkagg as tkagg
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt


#Animation function
def animate(ax,xList,y1List,y2List):
    time = datetime.datetime.now().strftime("%H:%M:%S")
    lb_Time.config(text=time)
    lb_Time['text'] = time
    xList.append(time)
#   Replace sample data below my real data...
    y1List.append(np.sin(len(xList)))
    y2List.append(2*np.sin(len(xList)))
    # Limit x and y lists to 20 items
    xList = xList[-20:]
    y1List = y1List[-20:]
    y2List = y2List[-20:]
    line, = ax.plot_date(mpl.dates.datestr2num(xList), y1List)
    plt.show()
    fenster.after(1000,animate,ax,xList,y1List,y2List)


fenster = Tk()
fenster.title("Monitoring")
fenster.geometry("450x400")
lb_Time = Label(fenster)
exit_button = Button(fenster, text="Beenden", command=fenster.destroy, fg="red")    
lb_Time.grid(row=2, column=0,pady=20)

xList = []
y1List =[]
y2List = []

fig = plt.Figure(figsize=(2, 2))
canvas = FigureCanvasTkAgg(fig, master=fenster)
canvas.get_tk_widget().grid(row=3,column=1,pady=20)

ax = fig.add_subplot(111)
line, = ax.plot_date(xList, y1List)
animate(ax,xList,y1List,y2List)

fenster.mainloop()

Моя проблема в том, что график только статический и отображает только 1 точку при значении y, равном 34. Почему не обновляется каждые 1 с и почему вообще не используется 34 (как я использовал синус ...)?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

mainloop является оператором блокировки, т.е. когда он встречается с ним, теперь будет выполняться дальнейший код.Вы можете проверить это, поместив оператор печати после mainloop.Я не слишком знаком с внутренней работой tkinter, но функция создания анимации может быть написана довольно тривиально с помощью родного matplotlib:

import numpy as np, matplotlib.pyplot as plt
fig, ax = plt.subplots()
# dummy data
N      = 100
buffer = np.zeros((N, 2))
p = ax.plot(*buffer.T, marker = '.')[0] # get plot object
while True:
    for idx in range(N):
        buffer[idx, :] = np.random.rand(buffer.shape[1])
        p.set_data(*buffer.T)
        # recompute data limits
        ax.relim()
        ax.axes.autoscale_view(True, True, True)

        # update figure; flush events
        fig.canvas.draw()
        fig.canvas.flush_events()
0 голосов
/ 03 марта 2019

Я сделал это, используя этот код

...

from matplotlib.animation import FuncAnimation

...

_ANIM_INTERVAL = 1000  # Milliseconds.


def animate(counter: int) -> None:
    """Refresh graph.

    :param counter: Function call counter (2 times for 0!!!).
    """
    ...

...

_ = FuncAnimation(fig, animate, interval=_ANIM_INTERVAL)
show(fig)

JM

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...