【问题标题】:Get status of Matplotlib radio button获取 Matplotlib 单选按钮的状态
【发布时间】:2015-01-05 17:18:27
【问题描述】:

使用 Matplotlib,我可以通过“mySlider.val”获取 Slider 小部件的值,非常方便。是否有等效的功能来获取单选按钮的当前选择?我认为这个问题是this question 试图问的问题,但提问者没有提供一个可行的例子。我提供以下示例,指示我正在寻找的缺少的代码行。

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

axSlider = plt.axes([0.1, 0.8, 0.4, 0.05])
aSlider  = Slider(axSlider,'A slider', 0,1,  valinit=0.5)

axRadio  = plt.axes([0.1, 0.2, 0.3, 0.4])
butRadio = RadioButtons(axRadio, ('Top','Middle','Bottom'))

axStatus = plt.axes([0.5, 0.2, 0.3, 0.4])
bStatus  = Button(axStatus,'Get status of radio buttons')

def get_status(val):
    #radioValue = ???? -- Need this line of code.
    radioValue = 0
    sliderValue= aSlider.val
    print 'Slider value: %.2f, Radio button value: %.2f'%(sliderValue,radioValue)

bStatus.on_clicked(get_status)
plt.show()

这是输出的样子:

如果这是不可能的,你能建议一个优雅的解决方法吗?目前我正在为单选按钮使用“on_clicked”函数并使用单选按钮的值设置全局变量,这很混乱。

【问题讨论】:

  • 如果您查看RadioButtons 的源代码,它不会记录这一点。您只需要为当前活动的按钮添加一个实例属性并在_clicked (github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/…) 中更新它,这似乎是它应该 具有的功能,并且欢迎添加它的 PR。
  • 感谢您的建议!我在 widgets.py 中添加了两行代码,似乎可以实现这一目标。具体来说,我在_clicked 函数中添加了self.val = t.get_text(),在__init__ 函数中添加了self.val = label。我创建了 matplotlib github 的拉取请求,但这是我第一次这样做,所以希望我做得正确。谢谢!

标签: python matplotlib scipy


【解决方案1】:

按照@tcaswell 的建议,我在github 上向matplotlib 提交了pull request,现在可以查询RadioButtons 的当前状态。缺少的代码行是:

radioValue = butRadio.value_selected

这计划被合并到 matplotlib 的 1.5.x 版本中。同时,如果你想使用这个功能,你需要下载matplotlib from github的开发版本(或者,至少下载'widgets.py'文件)。

现在已合并到当前版本的 Matplotlib (1.5.3) 中。 (参见Widets Docs。)如果上面这行不起作用,您可能只需要更新 Matplotlib。

【讨论】:

  • 这是合并的,将与 1.5 一起发布(即将推出)。
【解决方案2】:

最简单的答案是:

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

axSlider = plt.axes([0.1, 0.8, 0.4, 0.05])
aSlider  = Slider(axSlider,'A slider', 0,1,  valinit=0.5)

axRadio  = plt.axes([0.1, 0.2, 0.3, 0.4])
my_list = ('Top','Middle','Bottom')
butRadio = RadioButtons(axRadio, my_list)

axStatus = plt.axes([0.5, 0.2, 0.3, 0.4])
bStatus  = Button(axStatus,'Get status of radio buttons')

def activated_radio_button(x,list):     
    for i in xrange(len(x.circles)):
                if x.circles[i].get_facecolor()[0]<.5:
                    return list[i]

def get_status(label):
    radioValue = activated_radio_button(butRadio,my_list)
    sliderValue= aSlider.val
    print 'Slider value: %.2f, Radio button value: %s'%(sliderValue,radioValue)

bStatus.on_clicked(get_status)
plt.show()

【讨论】:

    【解决方案3】:

    刚刚偶然发现这篇文章正在研究同一问题。他们还没有对 matplotlib 进行任何更新,尽管我确实在这里找到了关于从 matplotlib 的检查按钮中检索值的相关帖子:Retrieving the selected values from a CheckButtons object in matplotlib

    总结答案是保留一个dict,在其中存储每个按钮的变量。每当按下按钮时,让事件处理程序更改 dict 中的必要值,然后可以根据需要由其他函数访问,而不是仅将值捕获在事件处理程序中。

    希望这会有所帮助!我知道我宁愿不玩 matplotlib 的源代码

    【讨论】:

    • 我确定不是,但我知道在我对 Python 的菜鸟水平上,我宁愿不碰它,所以也许我的回答会帮助我水平的其他人。现在我只希望他们在 matplotlib 中添加某种下拉菜单...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2013-12-06
    • 2012-12-15
    • 2019-03-09
    • 2015-09-08
    • 2022-12-07
    • 1970-01-01
    相关资源
    最近更新 更多