Ich arbeite gerade an einer Python-Anwendung, die ich angefangen habe, von Grund auf zu schreiben. Was ist bereits vorhanden ist:Python-Matplotlib Live-Grafik ohne Graph-Bewegung (Scrollen)
- Ein Thema im Hintergrund laufen sammelt Daten von einem Server und schreibt in eine Datei.
- Im Hauptthread i geöffnet haben eine matplotlib Graph GUI auf, die aus dieser Datei Live-Daten-Plots, die ich in Nummer 1 genannten
So sind Dinge, superfein und arbeitet als je, was ich oben erklärt haben. Aber wenn matplotlib die Live-Daten plotten, bewegt sich der Graph dynamisch, wenn die neuen Punkte zur Backend-Datei hinzugefügt werden, auf die er sich bezieht. Ich bin mir nicht sicher, ob ich mein Problem hier gut ausgedrückt habe. Was ich sagen will, ist, wenn der Live-Graph aktualisiert wird, bewegt sich der Graph-Bildschirm buchstäblich vorwärts (von links nach rechts) und der alte Graph (alte Punkte) wird unsichtbar (wenn sich der Bildschirm bewegt) und verloren. Wenn ich versuche, nach links zu scrollen (mit dem Scroll-Werkzeug des Standardwerkzeugs matplotlib), dann gibt es nur Leerzeichen. Was ich will ist:
- Der Bildschirm sollte nicht bewegen.
- Die alten Punkte sollten sichtbar sein, ohne nach links zu scrollen.
- Es sollten nur neue Punkte hinzugefügt werden und die alten Punkte sollten nicht gelöscht oder verschoben werden (verdeckt).
Hier ist mein Code:
#import modules
import Tkinter as tk
import MasterWindow
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from threading import Thread
from datetime import *
import matplotlib.dates as dates
from fabfile import connect
import time
from fabric.api import env
LARGE_FONT= ("Verdana", 12)
env.host_string = '[email protected]'
env.password = "nms"
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self,parent)
label = tk.Label(self, text="Graphy-Home", font=LARGE_FONT)
label.pack(pady=10,padx=10)
Command = tk.Label(self, text="Enter Command")
pickCommand = tk.Entry(self)
pickCommand.pack(pady=10)
Command.pack()
button1 = tk.Button(self, text="Submit Command", command=lambda: submit())
button1.pack()
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
def submit():
t1=Thread(target=FileWriter)
t1.start()
ani = animation.FuncAnimation(fig, animate, interval=1000)
plt.show()
print("done")
def FileWriter():
f=open('F:\\home\\WorkSpace\\FIrstPyProject\\TestModules\\sampleText.txt','w',0)
k=0
cmd=pickCommand.get()
while (k < 40):
print("inside while")
p=connect(cmd)
f.write(p.stdout)
f.write('\n')
print("wrote data")
k += 1
def animate(i):
print("inside animate")
pullData = open("sampleText.txt","r").read()
dataArray = pullData.split('\n')
xar = []
yar = []
for eachLine in dataArray:
if len(eachLine)>1:
x,y = eachLine.split(',')
timeX=datetime.strptime(x, "%H:%M:%S")
xar.append(timeX.strftime("%H:%M:%S"))
yar.append(float(y))
#ax1.plot(timeStamps,yar)
plt.plot_date(dates.datestr2num(xar), yar,'b-')
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Page One!!!", font=LARGE_FONT)
label.pack(pady=10,padx=10)
button1 = tk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
button1.pack()
button2 = tk.Button(self, text="Page Two",
command=lambda: controller.show_frame(PageTwo))
button2.pack()
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Page Two!!!", font=LARGE_FONT)
label.pack(pady=10,padx=10)
button1 = tk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
button1.pack()
button2 = tk.Button(self, text="Page One",
command=lambda: controller.show_frame(PageOne))
button2.pack()
app = MasterWindow.MasterWindow(StartPage, PageOne, PageTwo)
app.mainloop()
Nur ein Heads aufgeben, ist die belebte Funktion der in Hauptschleife ausgeführt wird und die Filewriter-Funktion wird in einem separaten Thread ausgeführt wird, Daten zu sammeln.
Ich hoffe, dass mein Problem so erklärt wird, dass es verstanden werden kann! Wenn etwas unklar ist, lass es mich wissen.
Zugabe ist es nicht, weil es auto-Waage nach jedem Auftragen Schritt? Wäre nicht 'plt.set_xlim (min, max)' nach 'plt.plot_date()' dein Problem zu beheben? Könnten Sie ein Stück Code bereitstellen, damit wir Ihre Handlung einfach reproduzieren können? – jrjc
Anstatt "while (k <40)" und dann "k" inkrementierend, schreibe einfach 'for k in range (40)'. –
@jeanrjc - Ich habe Ihnen den gesamten Code in meiner Frage –