Übergeordnete For Schleife in Methode fortsetzen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

Hi,

Ich hab da wieder mal ne Frage... teilweise zu Matplotlib, teilweise generell pyhton.

Ich hab ein Programm, das geht diverse Daten durch, und diese soll es dann plotten, undzwar bei jedem tastendruck einen anderen Datenatz. Bei escape soll es das Programm beenden. Letzteres klappt auch, aber das durchschalten will nicht so recht.

Hier ein beispiel:

Code: Alles auswählen

import matplotlib.pyplot as plt
import sys

x = [1,2]
y = [10,11]

lastx = 2
lasty = 11

for nummer in range(0,10):
	def keypressed(event):
		if event.key=='escape':		
			sys.exit()
		else:
			plt.close()
                        #continue
	x.append(lastx+1)
	lastx+=1
	y.append(lasty+1)
	lasty+=1
	fig = plt.figure()
	ax = fig.add_subplot(111)
	ax.plot(x,y)
	cid2 = fig.canvas.mpl_connect('key_press_event', keypressed)
	plt.show()
Wenn ich escape drücke, wirds beendet, drück ich was anderes, wird der plot zwar geschlossen, aber es geht nicht weiter. Da wo #continue steht, müsste also was rein das das Programm dazu veranlasst zur nächsten iteration in der for schleife zu gehen. Wenn da aber nur continue steht, krieg ich den fehler das continue nicht in einem loop ist.
Könnt ihr mir sagen wie ich das lösen kann?

edit: Wenn ich eine taste drücke, wird das fenster geschlossen, und die Forschleife auch abgearbeitet, das sieht man wenn man sich x und y ausgeben lässt, aber es wird kein neues plotfenster aufgemacht.
Thx.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

die Fehlermeldung deutet ja schon darauf hin: Du versuchst, die for-Schleife von außerhalb zu steuern, was so nicht gehen kann.
Und nach Deinem Thread-Titel zu urteilen ist Dir ja auch klar, dass Du die Funktion 'keypressed' an einen event bindest und 'keypressed' nicht innerhalb der Schleife abläuft, auch wenn Du die Funktion innerhalb dieser Schleife definierst, was im übrigen völliger Unfug ist, da Du die Funktion 10 x hintereinander neu definierst...
Auch dass Du 'fig' und 'cid2' innerhalb der Schleife erstellst kann doch so wohl nicht sinnvoll sein, oder?
Versuche doch mal folgenden Umbau:

Code: Alles auswählen

import matplotlib.pyplot as plt

def keypressed(event):
    if event.key=='escape':
        fig.canvas.mpl_disconnect(cid2)
        fig.close()

x = [1,2]
y = [10,11]

lastx = 2
lasty = 11

fig = plt.figure()
ax = fig.add_subplot(111)
cid2 = fig.canvas.mpl_connect('key_press_event', keypressed)

for nummer in range(0,10):
    x.append(lastx+1)
    lastx+=1
    y.append(lasty+1)
    lasty+=1    
    ax.plot(x,y)
    plt.show()
Auch das, was Du mit 'x'/'y' und 'lastx'/'lasty' machst scheint mir merkwürdig zu sein... warum nicht gleich

Code: Alles auswählen

#...
for x, y in zip(range(1,13), range(10,22)):
    ax.plot(x, y)
#...
Ich kenne die matplotlib nicht wirklich, deshalb weiß ich jetzt nicht, ob das, was ich in die 'keypressed' geschrieben habe auch stimmt und das Restliche so ok geht (was bewirkt beispielsweise das 'plt.show()'?)... ich denke halt einfach, dass Du das ganze umstrukturieren solltest...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

Hi,

plt.show() sorgt dafür das überhaupt erst ein Fenster angezeigt wird in dem geplottet wird.

Deine version tuts leider auch nicht. Da gehen zwei Fenster auf, und wenn man was drückt werden die geschlossen.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Warum iterierst Du nicht einfach über die Datensätze, definierst *vorher* eine Funktion zum plotten, entweder mit immer neuen Plots, die alle auf einmal aufgehen oder Plots, zum Schließen und plottest die Datensätze?

Und ansonsten wirf mal einen Blick auf pylab.clf().
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Arp hat geschrieben:Deine version tuts leider auch nicht.
Sorry, ich hab' das auch einfach zusammengeschustert, ohne matplotlib zu kennen. Mir ging es primär auch darum, Dir zu zeigen, dass Dein Beispiel meiner Ansicht nach falsch aufgebaut ist.

Ok, wer braucht schon einen Kalender... :D Ich hab' mir jetzt matplotlib mal installiert und Dir ein kleines Beispiel, wie man mit Tastatureingaben umgehen könnte, erstellt:

Code: Alles auswählen

import matplotlib.pyplot as plt
import random

def keypressed(event):
    if event.key == 'escape':
        plt.close()
    else:
        x = (random.randint(0, 15), random.randint(5, 20))
        y = (random.randint(5, 20), random.randint(0, 15))
        ax.plot(x, y)
        fig.canvas.draw()

x = (0, 20)
y = (20, 0)
fig = plt.figure()
ax = fig.add_subplot(111)
fig.canvas.mpl_connect('key_press_event', keypressed)
ax.plot(coords.x, coords.y)
plt.show()
Im übrigen sind auf der matplotlib-Seite viele Beispiele und auch 'ne gute Dokumentation zu finden... :wink:

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten