Seite 1 von 1

Punkt mit Slider bewegen

Verfasst: Dienstag 24. April 2018, 10:12
von maddin1991
Hallo,

ich bin neu hier und lerne seit einigen Wochen Python (2.7). Jetzt bin ich leider auf ein Problem gestoßen, welches ich alleine nicht lösen kann.

Ich möchte einen Punkt plotten und seinen Y-Wert über einen Slider steuern. Das Plotten und der Slider funktioniert, nur leider bewegt sich der Punkt nicht, weil der Wert des Sliders nicht an die Plot-Funktion übergeben wird.

Hier mein Code:

Code: Alles auswählen

import matplotlib.pyplot as plt
import time
from matplotlib.widgets import Slider

plt.ion()
fig, ax = plt.subplots()
punkt, = ax.plot(0,0,marker='o')
plt.show()

sollwert=0

def slidevent(value):
	sollwert = value
	return sollwert

sliderax = fig.add_axes([0.2, 0.02, 0.6, 0.03], axisbg='white')
slider = Slider(sliderax, 'Value', 0, 10, valinit=5)
slider.on_changed(slidevent)
slider.drawon = False

while True:
	plt.pause(1)
	punkt.set_ydata(sollwert)
	plt.draw()
Der "Sollwert" ist der Y-Wert, der vom Slider an den Punkt übergeben werden soll. Wieso funktioniert das so nicht?

Ich habe das ganze auch noch mit der FuncAnimation versucht, leider mit dem selben Ergebnis. Hier der Code:

Code: Alles auswählen

import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.widgets import Slider

fig, ax = plt.subplots()
ax.set_xlim(0, 5)
ax.set_ylim(0, 5)
punkt, = ax.plot(2.5,2.5,marker='o')

global sollwert
sollwert = 2.5

def slidevent(value):
	sollwert = value
	return sollwert

sliderax = fig.add_axes([0.2, 0.02, 0.6, 0.03], axisbg='white')
slider = Slider(sliderax, 'Value', 0, 10, valinit=2.5)
slider.on_changed(slidevent)
slider.drawon = False

def update(i, soll):
	punkt.set_ydata(soll)
	return punkt,

ani = animation.FuncAnimation(fig, update, fargs=(sollwert,), interval=100)
plt.show()
Hoffentlich kann mir jemand helfen. Danke!

Gruß
Martin

Re: Punkt mit Slider bewegen

Verfasst: Mittwoch 25. April 2018, 13:40
von maddin1991
Ich habe es jetzt selber gelöst. Ich habe die Funktion "slidevent" einfach weggelassen und den Sollwert durch "slider.val" ersetzt. So funktioniert es dann für beide Codevarianten. Bei der Variante mit FuncAnimation muss funktioniert es allerdings auch nur ohne "fargs=(slider.val)".

Trotzdem wäre ich über eine Erklärung dankbar, weshalb das mit dem ursprünglichen Code nicht funktioniert hat.