Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 13, 2014 11:49:38

MetalHead
От: Ленгер
Зарегистрирован: 2013-12-17
Сообщения: 88
Репутация: +  1  -
Профиль   Отправить e-mail  

Tkinter. Метод bind() и метод get()

Добрый день, товарищи! Задача такая, можно ли сделать так чтобы bind() сработал один раз подряд. Объясню наглядней, есть калькулятор, такая схема 1++1 не приемлема. Т.е. ограничить ввод одинаковых значений два раза подряд.
Задача 2. Можно ли с помощью метода get(), выдрать значение text(тобишь название кнопки) из виджета Button()?

Отредактировано MetalHead (Апрель 13, 2014 11:50:11)

Офлайн

#2 Апрель 13, 2014 12:30:56

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Tkinter. Метод bind() и метод get()

1. Можно. Но нужно писать логику самому. Проста часть клавиш после нажатия одной и до нажатия других нужно блокировать.
2. Там все значительно проще. Для этого при запуске bind передается event. Посмотрите, что он может и зачем вообще используется.

P.S. Будут вопросы - пишите …

Офлайн

#3 Апрель 13, 2014 13:16:34

MetalHead
От: Ленгер
Зарегистрирован: 2013-12-17
Сообщения: 88
Репутация: +  1  -
Профиль   Отправить e-mail  

Tkinter. Метод bind() и метод get()

1. Логику продумать можно, надо бы посидеть подумать, уже что-то пришло в голову.
2. Не до конца понял, объясните, как можно получить таким образом значения? Я так понимаю событие это к примеру <Button-1>?

Офлайн

#4 Апрель 13, 2014 14:25:36

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Tkinter. Метод bind() и метод get()

Нет. 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)

Посмотрите на код. Если не поймете, то я потом поясню.

P.S. Будут вопросы - пишите …

Офлайн

#5 Апрель 13, 2014 14:29:21

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Tkinter. Метод bind() и метод get()

Логика там простая.
При нажатии клавиши Вы смотрите, нажата ли клавиша из группы операций (*, +, -). Если нажата, то просто блокируете все эти клавиши (клавиши группы операций). При нажатии на любую цифру
блокировка снимается. Т.е. делаете всегда циклом

but_operation["state"] = "normal"

внутри обработчика нажатия цифр и

but_operation["state"] = "disabled"

внутри обработчика операций… Вот и все

Отредактировано 4kpt_II (Апрель 13, 2014 23:19:43)

Офлайн

#6 Апрель 15, 2014 10:52:32

MetalHead
От: Ленгер
Зарегистрирован: 2013-12-17
Сообщения: 88
Репутация: +  1  -
Профиль   Отправить e-mail  

Tkinter. Метод bind() и метод get()

Благодарен. Про блокировку клавиш не доконца понял, с питоном знаком всего 4 месяца

Отредактировано MetalHead (Апрель 15, 2014 10:57:18)

Офлайн

#7 Апрель 15, 2014 12:55:30

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Tkinter. Метод bind() и метод get()

Представим, что пользователь нажимает на кнопки.
У Вас кнопки можно разделить на два типа:
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)

Офлайн

#8 Апрель 16, 2014 09:21:18

MetalHead
От: Ленгер
Зарегистрирован: 2013-12-17
Сообщения: 88
Репутация: +  1  -
Профиль   Отправить e-mail  

Tkinter. Метод bind() и метод get()

4kpt_II, ух как разжевано, спасибо, будут вопросы отпишусь.

Офлайн

#9 Апрель 16, 2014 09:49:55

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Tkinter. Метод bind() и метод get()

Не за что. Пишите, если что. Никаких проблем

Офлайн

#10 Апрель 16, 2014 09:54:15

MetalHead
От: Ленгер
Зарегистрирован: 2013-12-17
Сообщения: 88
Репутация: +  1  -
Профиль   Отправить e-mail  

Tkinter. Метод bind() и метод get()

Вопрос появился, вот моя задумка:

    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"])
Т.е. в text виджета цифры у меня типа int(), а остальное(+, -, *, /) типа str().
Теперь же такая задумка, нужно сделать так чтобы проверять последнее введенное значение(символ, если конечно питон его в str() сам не конвертирует) в Entry(), если будет тип int(), то действуют кнопочки +, -, *, /, иначе они не работать не будут. Самый простой выход, если я конечно правильно рассуждаю.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version