Форум сайта python.su
Добрый день, товарищи! Задача такая, можно ли сделать так чтобы bind() сработал один раз подряд. Объясню наглядней, есть калькулятор, такая схема 1++1 не приемлема. Т.е. ограничить ввод одинаковых значений два раза подряд.
Задача 2. Можно ли с помощью метода get(), выдрать значение text(тобишь название кнопки) из виджета Button()?
Отредактировано MetalHead (Апрель 13, 2014 11:50:11)
Офлайн
1. Можно. Но нужно писать логику самому. Проста часть клавиш после нажатия одной и до нажатия других нужно блокировать.
2. Там все значительно проще. Для этого при запуске bind передается event. Посмотрите, что он может и зачем вообще используется.
P.S. Будут вопросы - пишите …
Офлайн
1. Логику продумать можно, надо бы посидеть подумать, уже что-то пришло в голову.
2. Не до конца понял, объясните, как можно получить таким образом значения? Я так понимаю событие это к примеру <Button-1>?
Офлайн
Нет. event, который bind передается в обработчик события.
Вы пишите обработчик события таким образом:
def call(event): print event.widget["text"] # but_1 = Tkinter.Button(root, text="one") but_1.pack() but_1.bind("<Button-1>", call) # but_2 = Tkinter.Button(root, text="two") but_2.pack() but_2.bind("<Button-1>", call)
Офлайн
Логика там простая.
При нажатии клавиши Вы смотрите, нажата ли клавиша из группы операций (*, +, -). Если нажата, то просто блокируете все эти клавиши (клавиши группы операций). При нажатии на любую цифру
блокировка снимается. Т.е. делаете всегда циклом
but_operation["state"] = "normal"
but_operation["state"] = "disabled"
Отредактировано 4kpt_II (Апрель 13, 2014 23:19:43)
Офлайн
Благодарен. Про блокировку клавиш не доконца понял, с питоном знаком всего 4 месяца
Отредактировано MetalHead (Апрель 15, 2014 10:57:18)
Офлайн
Представим, что пользователь нажимает на кнопки.
У Вас кнопки можно разделить на два типа:
1. Цифры.
2. Операции.
Каждая группа обрабатывается отдельным callback.
Представим процесс ввода.
Вначале, когда еще ни одна кнопка не нажата, должны работать только цифры. Все нажатия на клавиши операций должны игнорироваться. Для того, чтобы это было так, можно либо сделать их неактивными либо, чтобы не портить интерфейс, все их callback повесить на пустую функцию, которая ничего выполнять не будет. В обработчике цифр (тот обработчик, который добавляет цифры в поле ввода при нажатии на нужный button) Вы должны не только реализовать добавление в поле ввода, но и разблокирование клавиш операций или перенаправить их bind уже на действующую функцию и нормальный обработчик.
Внутри действующей функции или обработчика должно произойти следующее: добавиться операция в поле ввода и опять отключиться эта группа. Снова она должна перестать работать. А включится она сможет только тогда, когда опять будет введено число. Для отключения, как и в начале, можно использовать либо отключение активности либо просто опять перенаправить на функцию, которая ничего делать не будет.
Итого код следующий:
def pass_(event): pass # def entry_set(event): enrty.insert("end", event.widget["name"]) if event.widget["text"] in ["*", "+", "/"]: but_oper.bind("<Button-1>", pass_) else: but_oper.bind("<Butto-1>", entry_set) # but_oper.bind("<Button-1>", pass_) but_digit.bind("<Button-1>", entry_set)
Отредактировано 4kpt_II (Апрель 15, 2014 13:23:07)
Офлайн
4kpt_II, ух как разжевано, спасибо, будут вопросы отпишусь.
Офлайн
Не за что. Пишите, если что. Никаких проблем
Офлайн
Вопрос появился, вот моя задумка:
def click_on(self,event): if isinstance(event.widget["text"], str): self.ent.insert(END, event.widget["text"]) if isinstance(event.widget["text"], int): self.ent.insert(END, event.widget["text"])
Офлайн