2016-12-01 7 views
1

--update: Я изменилTkinter радиокнопку не обновляет переменную

variable=self.optionVal.get() 

в

variable=self.optionVal 

Но ничего changed.Also я задаюсь вопросом, почему он автоматически называют self.selected во время компиляции?

---- Оригинал:

Я пытаюсь получить знакомы с радиокнопкой, но я не думаю, что я понимаю, как RadioButton работы. Вот краткий код для демонстрации:

 self.optionVal = StringVar() 
    for text, val in OPTIONS: 
     print(text,val) 
     radioButton = Radiobutton(self, 
            text=text, 
            value=val, 
            variable=self.optionVal.get(), 
            command = self.selected()) 
     radioButton.pack(anchor=W) 

    def selected(self): 
     print("this option is :"+self.optionVal.get()) 

In my opinion this should work like once I choose certain button, and it prints out "this option is *the value*", however now what it does is once compiled, it prints out everything, and the self.optionVal.get() is blankspace, as if value wasn't set to that variable. 

I wonder what happens to my code, 
Many thanks in advance. 
+1

Вам необходимо передать ** фактическую переменную ** как параметр '' variable'', а не результат вызова '' .get() '' для переменной. – jasonharper

+0

@jasonharper Я пробовал, но он все еще не проходит – angieShroom

ответ

2

Вы очень близки. Просто вытащите .get() от self.optionVal.get(). Конструктор Radiobutton ожидает трассированную переменную, вы даете ей результат оценки этой переменной.

1

Вам нужно:

  1. Удалите .get() из variable=self.optionVal аргумента в конструкторе кнопки. Вы хотите передать переменную, а не оцениваемое значение переменной; и
  2. Удалите скобки из command=self.selected() и используйте вместо этого command=self.selected. В скобках говорится: «Теперь вызовите эту функцию и используйте возвращаемое значение в качестве обратного вызова». Вместо этого вы хотите использовать функцию как обратный вызов. Чтобы лучше понять это, вам нужно изучить закрытие: функция может возвращать функцию (и, если это было так, которая будет использоваться в качестве вашего обратного вызова).

EDIT: Быстрого напоминания, а также: Python не компилируется, но интерпретирован. Ваш обратный вызов вызывается, когда сценарий находится в , который интерпретируется.

+0

Большое спасибо за разъяснение для меня! Я последовал за 1 и 2, а теперь он только распечатывает «этот параметр:», когда я нажимаю на него, он все равно не дает соответствующего self.optionVal.get(), но продолжает отдавать пустое пространство. Есть ли у вас другая идея? Я думал, что он не обновляет self.optionVal вообще – angieShroom

+0

Что такое 'val' и' text' в вашем коде? Вставьте весь код. – jpmelos

1

AHA! Я верю, что понял. У меня была такая же проблема. убедитесь, что вы назначаете мастер к IntVar как self.rbv=tk.IntVar(master) #or 'root' or whatever you are using):

import Tkinter as tk 
import ttk 

class My_GUI: 

    def __init__(self,master): 
     self.master=master 
     master.title("TestRadio") 

     self.rbv=tk.IntVar(master)#<--- HERE! notice I specify 'master' 
     self.rb1=tk.Radiobutton(master,text="Radio1",variable=self.rbv,value=0,indicatoron=False,command=self.onRadioChange) 
     self.rb1.pack(side='left') 
     self.rb2=tk.Radiobutton(master,text="Radio2",variable=self.rbv,value=1,indicatoron=False,command=self.onRadioChange) 
     self.rb2.pack(side='left') 
     self.rb3=tk.Radiobutton(master,text="Radio3",variable=self.rbv,value=2,indicatoron=False,command=self.onRadioChange) 
     self.rb3.pack(side='left') 

    def onRadioChange(self,event=None): 
     print self.rbv.get() 

root=tk.Tk() 
gui=My_GUI(root) 
root.mainloop() 

попробуйте запустить что, нажмите на различные кнопки (они радиокнопки, но с indicatoron = False), и вы увидите, что она печатает правильно измененные значения!