同时使用 Matplotlib Slider 和 key_release_event
Using Matplotlib Slider and key_release_event concurrently
我正在使用 Matplotlib(具有 'tkAgg' 后端)来显示图像序列中的图像。
我有一个滑块小部件设置,允许我滚动图像序列 - 移动滑块会更改正在显示的图像。
我还有一个 mpl_connect 设置为专门从左右箭头键监听 key_relese_events,它调用相同的 on_change() 方法来前进到下一张图像或显示上一张图片。
这两个都运行良好,彼此独立:当程序打开时,滑块设置为显示堆栈中的第一张图像。然后,我可以来回移动滑块以显示不同的图像,也可以按向右或向左键来回移动一个图像。
我唯一的 qualm/question 是,当我使用箭头键前进图像时,滑块值根本没有改变。因此,如果您通过按向右箭头 20 次向前推进 20 张图像,将显示正确的图像并且绘图标题会相应更改,但滑块仍显示初始值或您按下箭头键时的任何值。
有什么方法可以设置 Slider 小部件的值并让屏幕更新以显示正确的值。我相信(尚未对其进行全面测试)您可以将滑块的值访问为 myslider.val - 但是设置该值似乎没有 link 甚至在调用 [=33 之后以图形方式显示的内容=]()
TL;DR 有没有办法将图中显示的 Slider 值绑定到局部变量,以便当该变量更改(显示新图像)时,Slider 会相应更改?
这真的只是为了美学价值,正如我之前提到的,我用于推进图像的两个控件彼此独立工作
以下是从我的源代码中截取的一些代码片段(排名不分先后)。我希望它足够清楚这些功能在做什么-
def on_change(val):
"""
This function updates the LEEM image based on the slider value, val
This function is also called to update the image when an arrow key release is detected
"""
global curimg
curimg = energy_to_filenumber(round(val, 1))
img = all_dat[0:imheight-1, 0:imwidth-1,
curimg]
leemax.set_title("LEEM Image: " + str(elist[
int(energy_to_filenumber(round(val, 1)))]) + ' eV')
leemax.imshow(img, cmap=cm.Greys_r)
pylab.draw()
def arrow_key_image_control(event):
"""
This function takes an event from an mpl_connection
and listens for key release events specifically from
the keyboard arrow keys (left/right) and uses this
input to advance/reverse to the next/previous image.
"""
global curimg
minindex = 0
maxindex = all_dat.shape[2] - 1
if event.key == 'left':
if curimg - 1 >= minindex:
curimg -= 1
on_change(filenumber_to_energy(curimg))
else:
pass
elif event.key == 'right':
if curimg + 1 <= maxindex:
curimg += 1
on_change(filenumber_to_energy(curimg))
else:
pass
else:
pass
sld_ax = fig.add_axes([0.2, 0.025, 0.75, 0.02])
imsld = Slider(sld_ax, "Electron Energy",
elist[0], elist[len(elist)-1], elist[0], valfmt='%1.1f')
imsld.on_changed(on_change)
id2 = fig.canvas.mpl_connect('key_release_event', arrow_key_image_control)
感谢@tcaswell 对解决方案的评论
Slider class slider.set_val() 中有一个未记录的方法,它完全满足了我的需要 - 它将滑块值设置为给定值,然后更新包含滑块的图形,因此变化是可见的。
我正在使用 Matplotlib(具有 'tkAgg' 后端)来显示图像序列中的图像。
我有一个滑块小部件设置,允许我滚动图像序列 - 移动滑块会更改正在显示的图像。
我还有一个 mpl_connect 设置为专门从左右箭头键监听 key_relese_events,它调用相同的 on_change() 方法来前进到下一张图像或显示上一张图片。
这两个都运行良好,彼此独立:当程序打开时,滑块设置为显示堆栈中的第一张图像。然后,我可以来回移动滑块以显示不同的图像,也可以按向右或向左键来回移动一个图像。
我唯一的 qualm/question 是,当我使用箭头键前进图像时,滑块值根本没有改变。因此,如果您通过按向右箭头 20 次向前推进 20 张图像,将显示正确的图像并且绘图标题会相应更改,但滑块仍显示初始值或您按下箭头键时的任何值。
有什么方法可以设置 Slider 小部件的值并让屏幕更新以显示正确的值。我相信(尚未对其进行全面测试)您可以将滑块的值访问为 myslider.val - 但是设置该值似乎没有 link 甚至在调用 [=33 之后以图形方式显示的内容=]()
TL;DR 有没有办法将图中显示的 Slider 值绑定到局部变量,以便当该变量更改(显示新图像)时,Slider 会相应更改?
这真的只是为了美学价值,正如我之前提到的,我用于推进图像的两个控件彼此独立工作
以下是从我的源代码中截取的一些代码片段(排名不分先后)。我希望它足够清楚这些功能在做什么-
def on_change(val):
"""
This function updates the LEEM image based on the slider value, val
This function is also called to update the image when an arrow key release is detected
"""
global curimg
curimg = energy_to_filenumber(round(val, 1))
img = all_dat[0:imheight-1, 0:imwidth-1,
curimg]
leemax.set_title("LEEM Image: " + str(elist[
int(energy_to_filenumber(round(val, 1)))]) + ' eV')
leemax.imshow(img, cmap=cm.Greys_r)
pylab.draw()
def arrow_key_image_control(event):
"""
This function takes an event from an mpl_connection
and listens for key release events specifically from
the keyboard arrow keys (left/right) and uses this
input to advance/reverse to the next/previous image.
"""
global curimg
minindex = 0
maxindex = all_dat.shape[2] - 1
if event.key == 'left':
if curimg - 1 >= minindex:
curimg -= 1
on_change(filenumber_to_energy(curimg))
else:
pass
elif event.key == 'right':
if curimg + 1 <= maxindex:
curimg += 1
on_change(filenumber_to_energy(curimg))
else:
pass
else:
pass
sld_ax = fig.add_axes([0.2, 0.025, 0.75, 0.02])
imsld = Slider(sld_ax, "Electron Energy",
elist[0], elist[len(elist)-1], elist[0], valfmt='%1.1f')
imsld.on_changed(on_change)
id2 = fig.canvas.mpl_connect('key_release_event', arrow_key_image_control)
感谢@tcaswell 对解决方案的评论
Slider class slider.set_val() 中有一个未记录的方法,它完全满足了我的需要 - 它将滑块值设置为给定值,然后更新包含滑块的图形,因此变化是可见的。