2010-11-13 2 views
0

Я делаю программу GUI в Tkinter и сталкиваюсь с проблемами. Что я хочу сделать, это сделать два флажка и кнопку. По словам пользователя, следующие шаги должны быть выполнены. Часть моего кода была показана ниже: -Комбинированное управление обработкой виджетов в TKinter

CheckVar1 = IntVar() 
CheckVar2 = IntVar() 
self.C1 = Checkbutton(root, text = "C Classifier", variable = CheckVar1, onvalue = 1, offvalue = 0, height=5,width = 20).grid(row=4) 

self.C2 = Checkbutton(root, text = "GClassifier", variable = CheckVar2, onvalue = 1, offvalue = 0, height=5, width = 20).grid(row=5) 

self.proceed1 = Button(root,text = "\n Proceed",command =  self.proceed(CheckVar1.get(),CheckVar2.get())).grid(row=6) 

# where proceed prints the combined values of 2 checkboxes 

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

Я искал в сети, и я думаю, что ответ связан с событиями лямбда или карри.

Пожалуйста, помогите ..

+0

Обратите внимание, что 'Checkbutton (...)' вычисляет контрольную кнопку, в то время как 'Checkbutton (...) .grid (...)' оценивает значение None, почему вы храните None в self.C1, self.C2 и self.proceed1? – tzot

ответ

1

можно передать значение из self.proceed(CheckVar1.get(),CheckVar2.get())Button в конструкторе, но по-видимому, что вы хотите для command быть установлен в функции которая будет вызывать self.proceed(CheckVar1.get(),CheckVar2.get()) и возвращать новое, возможно различное значение при каждом нажатии кнопки. Вы можете исправить это с помощью лямбда или путем обертывания вызова в короткой функции обратного вызова. Например, замените последнюю строку следующим образом:

def callback(): 
    return self.proceed(CheckVar1.get(), CheckVar2.get()) 
self.proceed1 = Button(root, text="\n Proceed", command=callback).grid(row=6) 

Это довольно типичный Tkinter. Помните: когда вы видите переменную с именем command в Tkinter, она ищет функцию , а не значение.

EDIT: быть ясно: вы получаете «NullType Объект не отозваны», потому что вы установили command равным возвращаемое значение одного вызова к self.proceed (это NullType Object). self.proceed - это функция, но ее возвращаемое значение не является. Вам нужно установить command как функцию, которая вызывает self.proceed.

+0

Эй, очень жаль, что это моя ошибка, так как это не было ясно из кода. self.proceed - это функция, которая принимает их как входные данные и печатает значения ... – 2010-11-14 08:21:01

+1

Это не меняет мой ответ. В настоящее время ваш код называет 'self.proceed' onc e, и устанавливает 'command' равным * значению *' self.proceed', когда вы хотите установить 'command' в * функцию *, которая вызывает' self.proceed' при каждом нажатии кнопки. –

+0

Привет, моя ошибка исчезла, но я не могу получить результат, который хочу. В этом я хочу работать с значениями CheckVar1 и CheckVar2. Как мне это сделать. Я думаю, что мое понимание было неправильным. – 2010-11-14 15:26:02

0

Как Петр Milley сказал, варианту command необходима ссылка на функцию (т.е. дать ему функцию имени (то есть:. Не скобка) Не пытается «инлайн» что-то, создать специальную функцию. Ваш код будет легче понять и поддерживать.

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