Комбинированная обработка событий виджетов в TKinter - PullRequest
0 голосов
/ 14 ноября 2010

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

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 Object не вызывается.

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

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

Ответы [ 2 ]

1 голос
/ 14 ноября 2010

Вы передаете значение из 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)

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

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

0 голосов
/ 14 ноября 2010

Как сказал Питер Милли, для опции command нужна ссылка на функцию (т. Е. Присвоить ей функцию name (т. Е. Без скобок). Не пытайтесь что-то "встроить", создайте специальную функцию. Ваш код будет легче понять и поддерживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...