ich möchte eine grafische Darstellung über einen kleinen Algorithmus hängen. Der Programmcode für das Diagramm soll aber nicht mit der Berechnung so verwickelt sein, dass ich die bunten Bildchen immer mit an Board habe (vielleicht weil auf dem Rechner gerade kein passendes grafisches Tool installiert ist). Daher habe ich eine Wrapperklasse "VizWrapper" zwischen die Klasse zur Darstellung und die für die Berechnung geschoben und von dort aus rufe ich eben die Darstellungsmethoden auf (oder lasse die Methoden eben leer). Da die grafische Darstellung mit show() in einer Endlosschleife verschwindet habe ich einen Thread angelegt, um die beiden Programmteile zu entkoppeln. Das Figure und die Axes Objekte habe ich als statische Objekte angelegt, weil ich die VizWrapper Methode analog in anderen Klassen des Programms einbauen möchte, aber immer die Ausgabe ins gleiche Diagramm produziert werden soll.
Leider ist die Anwendung schrecklich langsam und nur alle paar Sekunden gibts einen neuen Punkt im Diagramm.
Was mache ich falsch? Nach welchem Ansatz bekommen richtige Projekte ihre GUI verpasst? Bin als Neuling für alle Anregungen, Kritiken und Kopfschütteln dankbar
Ein schönes Wochenende
Poseidonius
Code: Alles auswählen
import threading
import random
import time
from pylab import figure, show
class Visualization(threading.Thread):
fig = figure()
ax = fig.add_subplot(111)
def __init__(self):
threading.Thread.__init__(self)
self.start()
def run(self):
print "Thread runs"
show()
def input_(self, value):
Visualization.ax.plot(1, value, 'go')
def output(self, value):
Visualization.ax.plot(1, value, 'go')
class VizWrapper(Visualization):
def __init__self(self):
Visualization.__init__(self)
def viz_output(self, value):
print "viz_output"
self.output(value)
Visualization.fig.canvas.draw()
def viz_input(self, value):
print "viz_input"
self.input_(value)
Visualization.fig.canvas.draw()
class calc(VizWrapper):
def calc_something(self):
while 1:
time.sleep(0.2)
value=random.random()
self.viz_input(value)
# irgendwelche Berechnungen
self.viz_output(value)
cal=calc()
cal.calc_something()