2017-04-14 3 views
1

matplotlib.widgets.Slider 인스턴스와 관련된 콜백 내부에서 valmin, valmaxval 특성을 수정 한 다음 Slider을 다시 그려야합니다. 다시 그릴 때 아무 일도 일어나지 않습니다.일부 속성을 변경 한 후 위젯을 강제로 다시 그리는 방법?

콜백이 완료되기 전에 plt.draw()으로 전화를 걸고 나머지 플롯은 올바르게 업데이트되지만 Slider은 이전과 동일하게 보입니다. 나는 SliderAxesdraw()을 호출 해 보았습니다. 눈에 보이는 변화는 없었습니다.

Slider 인스턴스의 속성을 변경 한 후 강제로 다시 그릴 수 있습니까?

Thansk!

UPDATE 여기

(원유 대화 상자가) 문제를 보여줍니다 작은 프로그램. 원하는 동작은 라디오 버튼의 다른 값을 클릭하면 슬라이더가 값 범위, 현재 값 및 레이블을 변경한다는 것입니다. 대신 "그라디언트"를 클릭하면 슬라이더가 응답을 멈추고 (더 이상 드래그 할 수 없음) "그라디언트"또는 "채널"을 클릭하면 plt.draw()

from matplotlib import pyplot as plt 
from matplotlib import gridspec 
from matplotlib.widgets import Slider, RadioButtons 

# Set the grid 
grid = gridspec.GridSpec(2, 1, height_ratios=[1, 2]) 

# Plot the sliders 
axes_slider = plt.subplot(grid[0, 0]) 
slider = Slider(axes_slider, 'Channel', valmin=0, valmax=255, valinit=128) 

# Plot the radio buttons 
axes_button = plt.subplot(grid[1, 0]) 
button = RadioButtons(axes_button, ('Gradient', 'Channel'), active=1) 

plt.tight_layout(h_pad=0) 
plt.subplots_adjust(left=.2, right=.9) 

def update(_): 
    take_gradient = True if button.value_selected == 'Gradient' else False 
    if take_gradient: 
     slider.valmin = -1 
     slider.valmax = 1 
     slider.val = 0 
     slider.label= 'Gradient' 
     slider.valinit = 0 
    else: 
     slider.valmin = 0 
     slider.valmax = 255 
     slider.val = 128 
     slider.label = 'Channel' 
     slider.valinit = 128 
    plt.draw() 

# Register call-backs with widgets 
slider.on_changed(update) 
button.on_clicked(update) 

plt.show() 
에도 불구하고 업데이트되지 않습니다.
+0

: 여기

은 작업 예입니다. – Fanta

+0

코드 샘플로 질문을 업데이트했습니다. – Fanta

답변

1

슬라이더 자체는 일부 매개 변수를 호스팅하고 관리하는 클래스입니다. 그것은 draw 메소드가 없습니다.

즉, 슬라이더의 매개 변수를 설정하는 것만으로는 충분하지 않으며 슬라이더가있는 축을 업데이트해야합니다. 결국이 모든 것은 슬라이더가 초기화를 수행하는 단계를 정확하게 수행하는 것을 요약합니다 따라서 silder의 __init__ 함수를 간단하게 호출 할 수 있습니다.

두 개의 다른 기능을 사용하는 것이 좋습니다. 하나는 버튼 클릭시 호출되는 슬라이더를 변경하는 것이고 다른 하나는 슬라이더 값을 조정할 때 발생할 수있는 기능입니다. 난 아직도 문제를 재현 짧은 프로그램을 마련하려고합니다

from matplotlib import pyplot as plt 
from matplotlib import gridspec 
from matplotlib.widgets import Slider, RadioButtons 

# Set the grid 
grid = gridspec.GridSpec(2, 1, height_ratios=[1, 2]) 

# Plot the sliders 
axes_slider = plt.subplot(grid[0, 0]) 
slider = Slider(axes_slider, 'Channel', valmin=0, valmax=255, valinit=128) 

# Plot the radio buttons 
axes_button = plt.subplot(grid[1, 0]) 
button = RadioButtons(axes_button, ('Gradient', 'Channel'), active=1) 

plt.tight_layout(h_pad=0) 
plt.subplots_adjust(left=.2, right=.9) 

def buttonupdate(val): 
    if val == "Gradient": 
     axes_slider.clear() 
     slider.__init__(axes_slider, 'Gradient', valmin=-1, valmax=1, valinit=0)   
    else: 
     axes_slider.clear() 
     slider.__init__(axes_slider, 'Channel', valmin=0, valmax=255, valinit=128) 
    plt.gcf().canvas.draw_idle() 

def sliderupdate(val): 
    if slider.label.get_text() == 'Gradient': 
     #do something depending on gradient value 
     pass 
    else: 
     #do something depending on channel value 
     pass 

# Register call-backs with widgets 
slider.on_changed(sliderupdate) 
button.on_clicked(buttonupdate) 

plt.show()