2016-08-03 2 views
2

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

from Tkinter import * 
master = Tk() 
master.geometry("200x100") 
def bla(): 
    return 1 
Button(master, command = bla, text = 'OK').pack() 

if bla == 1: 
    print('1') 

mainloop() 

Я также пытался сделать это с помощью лямбда, но я не мог понять, что один тоже.

ответ

2

Попробуйте взглянуть на эту ссылку https://stackoverflow.com/a/11907627/3110529, поскольку она решает проблемы, которые у вас есть.

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

if bla == 1: print('1')

вы спрашиваете, если указатель функции (или ссылка?) Равно 1, которые, очевидно, никогда не будет.

Возможно, у вас может возникнуть искушение использовать глобальные переменные (т. Е. Сохранить переменную «blah», а затем вернуть ее значение), но это обычно считается плохой практикой. Вместо этого, как и в ссылке, попробуйте преобразовать его в класс, который позволит вам использовать переменные-члены для хранения результатов и ответов обратных вызовов более организованным образом.

+1

Это на самом деле лучше, чем ответ, который я написал. Здесь у меня есть мое преимущество. – Readme

1

Ваша проблема заключается в том, что вы не сохраняете возвращаемое значение bla().

Вы можете сделать это с помощью глобальной переменной:

from Tkinter import * 
master = Tk() 
master.geometry("200x100") 

gloBla = 0 
def bla(): 
    global gloBla 
    gloBla = 1 
Button(master, command = bla, text = 'OK').pack() 


mainloop() 

if gloBla == 1: 
    print('1') 
0

Согласно Tknitter документации http://effbot.org/tkinterbook/variable.htm, вы можете использовать BooleanVarStringVar или IntVar. Они функционируют как глобальные переменные. В этой вазе Variable Изменения с каждым нажатием кнопки.

from Tkinter import * 
master = Tk() 
Variable = BooleanVar() 
Variable.set(False) 

app = Frame(master, borderwidth=10).grid() 

def bla(): 
    print("1") 
    if Variable.get() == 0:Variable.set(True) 
    else:Variable.set(False) 
    print("current state of Variable: {0} ".format(Variable.get())) 

button1= Button(app, text = "Click Me",command=lambda:bla()).grid() 

mainloop() 

Команда lambda: убедитесь, что функция не вызывается при запуске.

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