Python — создайте ползунок для управления вводом функции

avatar
Denny
9 августа 2021 в 06:04
365
1
0

У меня есть следующие коды

def update(val):
    if val == 0:
        value = s.val
        ax1.cla()
        ax1.plot_surface(x, y, rm, cmap = cm.coolwarm, linewidth = 0, antialiased = False)        
    elif val == 1:
        value = s.val
        ax1.cla()
        ax1.plot_surface(x, y, rm1, cmap = cm.coolwarm, linewidth = 0, antialiased = False)
    elif val == 2:
        value = s.val
        ax1.cla()
        ax1.plot_surface(x, y, rm2, cmap = cm.coolwarm, linewidth = 0, antialiased = False)      
    
ax1.set_zlim(-110, -80)



slider = wg.IntSlider(value=1, min=1, max=3, description='this is     slider')
slideroutput = wg.Output()
display(slider, slideroutput)

def on_value_change(change):
    with slideroutput:
        print(change['new'])

slider.observe(on_value_change, names='value')


update(slideroutput)
plt.show()

Если вход обновления "i", он показывает i-й трехмерный график в определении функции обновления, где i = 1, 2, 3.

Как спроектировать ползунок таким образом, чтобы при перемещении кнопки управления ползунка на выходе ползунка было 1, 2 или 3, что станет вводом для «обновления»?

Например

update(slider_button)

Спасибо!

Источник

Ответы (1)

avatar
Karina
9 августа 2021 в 07:15
2

Это функция, которую вы ищете:

import ipywidgets as wg

slider = wg.IntSlider(value=1, min=1, max=3, description='this is slider')
slideroutput = wg.Output()
display(slider, slideroutput)

def on_value_change(change):
    with slideroutput:
        print(change['new'])

slider.observe(on_value_change, names='value')

Однако я настоятельно рекомендую вам найти другую альтернативу (например, выпадающий список или кнопку вместо ползунка). Используйте ползунок .observe. Это приводит к тому, что программа становится очень тяжелой, особенно при использовании в сочетании с 3D-графиком. В приведенном выше коде есть простая команда печати, однако вы можете видеть, что она не работает так гладко. Можете себе представить, насколько это хуже, если связать с 3D-сюжетом.

---редактировать---

numberonslider = []
def on_value_change(change):
    
    with slideroutput:
        numberonslider.append(change['new'])
        print(numberonslider[-1])
slider.observe(on_value_change, names='value')
Denny
9 августа 2021 в 07:35
0

Выглядит хорошо. Однако есть ли способ получить последнее значение slideroutput? Когда я использую «slideroutput [-1]», python говорит: «Объект 'Output' не подлежит подписке». Спасибо!

Karina
9 августа 2021 в 08:25
0

что вы имеете в виду под последним значением?

Denny
9 августа 2021 в 08:34
0

Например, я перемещаю ползунок, и вывод слайдера дает «2 3 2 3 1 2 1», последнее значение должно быть 1. Однако я не могу использовать слайдер[-1], чтобы получить это значение. Есть ли способ получить последнее значение вывода слайдера? Спасибо!

Karina
9 августа 2021 в 08:53
0

Когда будет вызван этот вывод? Я имею в виду, после какого действия пользователя? То, как это сделать или возможно ли это, сильно зависит от этого.

Denny
9 августа 2021 в 12:47
0

«slideroutput» — это вывод ползунка. Я хочу, чтобы этот вывод был вводом функции update(), поскольку этот ввод будет параметром цикла if-else в функции update().

Karina
9 августа 2021 в 13:06
0

Да, и у меня вопрос: как будет вызываться функция update()? используя Button? Потому что без кнопки я не вижу никакой пользы и пользы от этого. Но кто я такой, чтобы судить, см. мой ответ ниже --edit--

ac24
10 августа 2021 в 12:40
0

Вы можете проверить ключевое слово continuous_update=True, чтобы запускать наблюдаемую функцию только тогда, когда вы отпускаете ползунок, а не при каждом изменении значения при перемещении.

Karina
10 августа 2021 в 13:01
0

@ac24 возможно, моя машина просто работает очень медленно, но по умолчанию, даже без ввода continuous_update=True, я каким-то образом получаю значение только тогда, когда отпускаю ползунок.