jetzt erstmal die vorgeschichte, dann meine fragen.
von meinem hauptprogramm aus erstelle ich ein neues objekt meiner eigenen klasse Plotting, die von threading.Thread erbt. der thread wird dann vom hauptprogramm aus gestartet, das natürlich parallel weiterläuft:
Code: Alles auswählen
plot = Plotting(tmpFilePath, unit, scanKeys, plotKeys)
plot.start()
Code: Alles auswählen
def run(self):
# (...)
pylab.ion() # interactive mode on
fig = pylab.figure(id) # figure erstellen
# daten für die plots aus datei holen usw., werden dann gespeichert im dictionary self.__data/self.__timestamps
self.__initPlots()
# zeichnen
for key in self.__plotKeys:
line, = pylab.plot(self.__timestamps, self.__data[key], label=Globals.CONFIGFILE.Channels[key].Name)
self.__lines[key] = line
pylab.draw()
ABER:
für den fall, dass der benutzer einen plot sehen will, der sich kontinuierlich aktualisiert, geht es mit einer schleife weiter:
Code: Alles auswählen
while True:
self.__getData() # neue daten holen und self.__data/self.__timestamps aktualisieren
''' # methode 1
for key in self.__plotKeys:
self.__lines[key].set_xdata(self.__timestamps)
self.__lines[key].set_ydata(self.__data[key])
'''
# methode 2
for key in self.__plotKeys:
del self.__lines[key]
line, = pylab.plot(self.__timestamps, self.__data[key], label=Globals.CONFIGFILE.Channels[key].Name)
self.__lines[key] = line
pylab.draw()
- methode 1 funktioniert überhaupt nicht, das programm friert ohne fehlermeldung ein. warum?
- methode 2 aktualisiert die linien fortlaufend, aber sie wechseln immer die farbe, als würden immer neue plots hinzugefügt werden (daher der versuch des löschens mit del self.__lines[key] - scheint aber nichts zu bringen)
- wie kann ich den klick auf das X des plot-fensters abfangen, um die schleife zu beenden? sonst läuft der thread ja bis in alle ewigkeit weiter.
- warum bringt der erste klick auf den plot-button im hauptprogramm immer keinen plot hervor, obwohl der thread gestartet wurde (danach geht es aber, also mit dem zweiten klick)? habe dazu auch versucht, unterschiedliche backends zu benutzen (matplotlib.use('GTK'), matplotlib.use('GtkAgg'), matplotlib.use('TkAgg')), aber alles funktioniert.. naja, unterschiedlich schlecht. wer dazu mehr wissen will, dem kann ich auch noch fehlermeldungen präsentieren.
hat jemand auch nur einen klitzekleinen tipp zu irgendeinem problem davon für mich? hab ich irgendwas übersehen?