2016-11-12 4 views
0

Это происходит от кнопки, которая при нажатии генерирует радиобуй. Я не могу получить доступ к выбору, сделанному с помощью радиобарабана. Все работает нормально, но выход выбранной функции равен нулю. Я пытаюсь использовать как локальный, так и глобальный var, но результат тот же.Функция обратного вызова Python tkinter RadioButton

def callback_st(): # RadioButton select technology 
    var = IntVar() 
    m=0 
    for m in range(len(un_tech)): 
     Radiobutton(radio_frame, text=un_tech[m], value=m, variable=var, 
        command=selected(var)).pack(anchor=W) 

def selected(var): 
    print(var) 

Это не работает. Я решил с помощью лямбда:

def selected(jst): 
     global sel_technology 
     sel_technology=un_tech[jst] 
     print(sel_technology) 

def callback_st(): #RadioButton select technology 
    var_st = IntVar() 
    m=0 
    for m in range(len(un_tech)): 
    Radiobutton(radio_frame, text=un_tech[m], value=m, variable=var_st, 
       command = lambda jst=m: selected(jst)).pack(anchor=W) 

Это работает, как я хочу, но это не решение, которое я хочу, и я думаю, что это не правильный путь. Итак, кто-нибудь может помочь мне найти правильный путь?

+0

Вы знакомы с концепцией местных и глобальных переменных? 'var' - локальная переменная. –

ответ

1

В первой попытке, вы вызовselected немедленно, когда var имеет значение 0. Вы избегали этого с помощью выражения лямбда, но вы правы, что это неудобное обходное решение для первоначальной ошибки. Сделайте var глобальным и получите selected доступ к нему как к глобальному. Изменение вашего первого кода:

var = IntVar() 
def selected(): 
    print(var.get()) 
def callback_st(): 
    ... 
     ...command=selected... 

Если вы определяли класс и методы, var был бы атрибутом экземпляра вместо глобального.

Смежные вопросы