#python #matplotlib #slider
#python #matplotlib #слайдер
Вопрос:
Я хочу использовать виджет слайдера matplotlib, чтобы позволить пользователю выбирать значение. Я хочу добавить кнопку, на которую пользователь может нажать, как только они закончат. Эта кнопка просто закрывает окно matplotlib. Затем я хочу написать код, который будет использовать значение слайдера непосредственно перед закрытием окна. Я придумал следующий сценарий:
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button
#Create a slider
axcolor = 'lightgoldenrodyellow'
axg = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor=axcolor)
gstart = 0
gend = 100
valinit = 50
valstep = 1
sg = Slider(axg, 'g', gstart, gend, valinit=valinit, valstep=valstep)
def update(event):
pass
sg.on_changed(update)
#Create quit button
quitax = plt.axes([0.8, 0.025, 0.1, 0.04])
quit_button = Button(quitax, 'Quit', color=axcolor, hovercolor='0.975')
def quit(event):
plt.close()
quit_button.on_clicked(quit)
while True:
if len(plt.get_fignums()) == 0:
break
#Here I planned to add code using the slider position before the user
#clicked on the quit button
g = sg.val
Я надеялся, что «цикл while» внизу приостановит выполнение программы до тех пор, пока окно matplotlib не будет закрыто. Затем, как только он будет закрыт, выполнение продолжится, и я смогу использовать значение слайдера для своих целей. К сожалению, это не работает. Есть идеи, как это исправить?
Комментарии:
1. ваш код отлично работает для меня, если я заменю ваш
while
цикл наplt.show()
. Этот вызов блокируется и будет ждать закрытия окна, после чего выполняется остальная часть кода.2. @Diziet: Спасибо, но я уже пробовал это. При предлагаемой вами замене значение g после выполнения скрипта равно 50 (начальное значение) независимо от положения слайдера перед нажатием кнопки «Выйти».
3. странно, для меня это работает нормально.
Ответ №1:
Я не знаю, почему ваш код ведет себя в моей системе иначе, чем в вашей, но возможным решением является сохранение обновленного значения слайдера в глобальной переменной:
slider_value = valinit
def update(val):
global slider_value
slider_value = val
sg.on_changed(update)
Ответ №2:
Я забыл упомянуть, что изначально я запускал этот код в Spyder (Anaconda). Я повторно запустил код с циклом «while», замененным на plt.show()
#Diziet, предложенный выше в PyCharm. Работает отлично, как и ожидалось. Так что это, должно быть, проблема среды или какие-то неправильные настройки в моем Spyder. Я должен был протестировать это перед публикацией вопроса и извиниться за то, что напрасно привлек внимание сообщества. Ошибки новичка.