Сейчас я работаю над проектом, в котором Мне нужно выбрать случайный файл из 74 файлов CSV и визуализировать его с помощью Python и matplotlib. У меня все хорошо, я обернул визуализацию в графический интерфейс Tinker, и график выглядит очень хорошо. Одним из требований проекта является то, что мне нужно иметь возможность установить время, в течение которого будет происходить визуализация. единственная проблема в том, что анимация занимает больше времени, чем я хочу установить.
Это мой код:
Код: Выделить всё
import tkinter as tk
from tkinter import ttk
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import os
import random
class AnimationGUI:
def __init__(self, root):
self.root = root
self.root.title("Animation GUI")
self.fig, self.ax = plt.subplots()
# Verzeichnis aus dem Csv Dateien eingelesen werden
os.chdir('C:\\Users\\hoppel\\Documents\\CSV Profile 2')
# Einlesen der Csv Datei
self.number = random.randint(1, 74)
dateiend = '.csv'
Datei = str(self.number) + dateiend
self.Daten = pd.read_csv(Datei, sep=';')
self.Daten['Uhrzeit'] = pd.to_datetime(self.Daten['Uhrzeit'], format='%H:%M:%S')
self.max_verbrauch = self.Daten['Verbrauch'].max()
# GUI-Elemente erstellen
self.canvas = FigureCanvasTkAgg(self.fig, master=root)
self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
self.start_button = ttk.Button(root, text="Start", command=self.start_animation)
self.start_button.pack(side=tk.LEFT)
self.stop_button = ttk.Button(root, text="Stop", command=self.stop_animation)
self.stop_button.pack(side=tk.LEFT)
self.duration_label = ttk.Label(root, text="Animationsdauer (Minuten):")
self.duration_label.pack(side=tk.LEFT)
self.duration_entry = ttk.Entry(root)
self.duration_entry.insert(0, "5") # Default value
self.duration_entry.pack(side=tk.LEFT)
# Zeitdaten als Label erstellen
self.time_label = ttk.Label(root, text="Zeitdaten")
self.time_label.pack(side=tk.TOP)
self.time_data_label = ttk.Label(root, text="")
self.time_data_label.pack(side=tk.TOP)
self.ani = None
def plotfunc(self, i):
index = int(i * len(self.Daten) / self.num_frames)
window_start = max(index - 15 * 60, 0)
window_end = min(index, len(self.Daten) - 1)
window_data = self.Daten.iloc[window_start:window_end]
self.ax.cla()
lines, = self.ax.plot(window_data['Uhrzeit'], window_data['Verbrauch'], color='red')
self.ax.set_xlabel('Zeitraum')
self.ax.set_ylabel('Verbrauch')
self.ax.set_title('Tagesverbrauch ' + str(self.number))
self.ax.set_ylim(0, self.max_verbrauch + 30)
self.ax.set_xlim
self.ax.set_xticks([])
self.ax.set_facecolor('black')
# Aktualisieren der Zeitdaten
current_time = self.Daten.iloc[index]['Uhrzeit']
self.time_data_label.config(text=current_time.strftime("%H:%M:%S"))
return [lines]
def start_animation(self):
duration_minutes = int(self.duration_entry.get())
fps = 40
self.num_frames = int(fps * 60 * duration_minutes)
if self.ani is None:
self.ani = FuncAnimation(self.fig, self.plotfunc, frames=self.num_frames, interval=1000 / fps, blit=True)
else:
self.ani.event_source.start()
def stop_animation(self):
if self.ani is not None:
self.ani.event_source.stop()
root = tk.Tk()
app = AnimationGUI(root)
root.mainloop()
Код: Выделить всё
Uhrzeit;Verbrauch
00:00:01;252
00:00:02;252
00:00:03;252
00:00:04;252
00:00:05;252
00:00:06;252
00:00:07;251
00:00:08;251
00:00:09;251
Источник: https://stackoverflow.com/questions/781 ... e-a-way-to