2015-01-05 4 views
4

Используя Matplotlib, я могу получить значение виджета Slider с помощью «mySlider.val», что очень удобно. Есть ли эквивалентная возможность получить текущий выбор кнопки Radio? Я думаю, что этот вопрос - это то, что пытался спросить this question, но искатель не представил рабочий пример. Я предоставляю следующий пример, указывающий на недостающую строку кода, которую я ищу.Получить статус переключателя Matplotlib

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() 

Вот что выглядит результат:

enter image description here

Если это невозможно, то вы можете предложить элегантный обходным? В настоящее время я использую функцию «on_clicked» для кнопок «Radio Buttons» и устанавливаю глобальные переменные со значениями переключателей, и это грязно.

+5

Если вы посмотрите на исходный код для 'RadioButtons' не следить за этим. Вам просто нужно добавить атрибут экземпляра для текущей активной кнопки и обновить его в '_clicked' (https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/widgets.py#L610). Это похоже на особенность, которую он должен был иметь, и PR, чтобы добавить его, было бы очень желанным. – tacaswell

+0

Спасибо за предложение! Я добавил две строки кода в widgets.py, которые, похоже, достигают этой цели. В частности, я добавил 'self.val = t.get_text()' к функции '_clicked' и' self.val = label' функции '__init__'. Я создал запрос на перенос matplotlib github, но это первый раз, когда я это сделал, поэтому, надеюсь, я сделал это правильно. Благодаря! – DanHickstein

ответ

3

Как было предложено @tcaswell, я отправил pull request в matplotlib на github, и теперь можно запросить текущий статус RadioButtons. Недостающий строка кода:

radioValue = butRadio.value_selected 

Это планируется включить в релиз 1.5.x в Matplotlib. В то же время, если вы хотите использовать эту функцию, вам необходимо загрузить выпуск разработчика matplotlib from github (или, по крайней мере, загрузить файл widgets.py).

Это теперь включено в текущую версию Matplotlib (1.5.3). (См. Widets Docs.) Если эта строка выше не работает, вы можете скорее всего обновить Matplotlib.

+1

Это объединено и будет выпущено с 1.5 (скоро «скоро»). – tacaswell

+0

Не забудьте принять свой ответ. – tacaswell

0

Просто наткнулся на это сообщение, проводя исследование по этой же проблеме. Они не сделали ни одного обновления в Matplotlib еще, хотя я нашел родственный пост на получение значения из checkbuttons Matplotlib здесь: Retrieving the selected values from a CheckButtons object in matplotlib

Резюмируя ответ, чтобы сохранить dict, в котором вы храните переменные для каждого кнопка. Всякий раз, когда нажимается кнопка, обработчик события меняет необходимые значения в dict, к которым затем могут обращаться другие функции по мере необходимости, а не значения, попавшие в один только обработчик события.

Надеюсь, это поможет! Я знаю, что я предпочел бы не поиграться с исходным кодом Matplotlib в

+1

Это не так. – tacaswell

+0

Я уверен, что это не так, но я знаю, что на моем уровне noobish с Python я бы не стал его трогать, поэтому, возможно, мой ответ поможет другим на моем уровне. Теперь я просто хочу, чтобы они добавили какое-то выпадающее меню в matplotlib ... – NGXII

1

Самый простой ответ:

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() 
Смежные вопросы