如何在更改其某些属性后强制重绘小部件?
How to force redraw of a widget after changing some of its attributes?
在matplotlib.widgets.Slider
实例关联的回调中,我想修改Slidervalmin
、valmax
和val
属性,然后重新绘制Slider
。当我尝试重新绘制它时,什么也没有发生。
在回调完成之前,我调用了 plt.draw()
,并且在绘图的其余部分正确更新的同时,Slider
看起来和以前一样。我还尝试在 Slider
的 Axes
上调用 draw()
,同样没有明显的变化。
如何在更改其属性后强制重新绘制 Slider
实例?
谢谢!
更新
这是一个演示问题的小程序(带有粗略的对话框)。想要的行为是通过单击单选按钮的不同值,滑块更改值范围、当前值和标签。相反,当单击 "Gradient" 时,滑块停止响应(无法再拖动),而当单击 "Gradient" 或 "Channel" 时,尽管有调用,滑块仍未更新至 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()
滑块本身是一个 class,用于承载和管理一些参数。它没有绘制方法。
就是说,仅仅设置滑块的参数是不够的,您还需要更新滑块所在的轴。最后,所有这些都总结为滑块正在执行的步骤初始化,所以你可以简单地调用 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()
在matplotlib.widgets.Slider
实例关联的回调中,我想修改Slidervalmin
、valmax
和val
属性,然后重新绘制Slider
。当我尝试重新绘制它时,什么也没有发生。
在回调完成之前,我调用了 plt.draw()
,并且在绘图的其余部分正确更新的同时,Slider
看起来和以前一样。我还尝试在 Slider
的 Axes
上调用 draw()
,同样没有明显的变化。
如何在更改其属性后强制重新绘制 Slider
实例?
谢谢!
更新
这是一个演示问题的小程序(带有粗略的对话框)。想要的行为是通过单击单选按钮的不同值,滑块更改值范围、当前值和标签。相反,当单击 "Gradient" 时,滑块停止响应(无法再拖动),而当单击 "Gradient" 或 "Channel" 时,尽管有调用,滑块仍未更新至 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()
滑块本身是一个 class,用于承载和管理一些参数。它没有绘制方法。
就是说,仅仅设置滑块的参数是不够的,您还需要更新滑块所在的轴。最后,所有这些都总结为滑块正在执行的步骤初始化,所以你可以简单地调用 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()