Seite 1 von 1

Übergeordnete For Schleife in Methode fortsetzen?

Verfasst: Donnerstag 4. August 2011, 20:49
von Arp
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.

Re: Übergeordnete For Schleife in Methode fortsetzen?

Verfasst: Donnerstag 4. August 2011, 23:40
von mutetella
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

Re: Übergeordnete For Schleife in Methode fortsetzen?

Verfasst: Freitag 5. August 2011, 09:24
von Arp
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.

Re: Übergeordnete For Schleife in Methode fortsetzen?

Verfasst: Freitag 5. August 2011, 10:59
von CM
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().

Re: Übergeordnete For Schleife in Methode fortsetzen?

Verfasst: Freitag 5. August 2011, 17:58
von mutetella
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