Как я могу использовать значение виджета слайдера?

#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. Я должен был протестировать это перед публикацией вопроса и извиниться за то, что напрасно привлек внимание сообщества. Ошибки новичка.