Найти - Пользователи
Полная версия: Tkinter. Метод bind() и метод get()
Начало » GUI » Tkinter. Метод bind() и метод get()
1 2
MetalHead
Добрый день, товарищи! Задача такая, можно ли сделать так чтобы bind() сработал один раз подряд. Объясню наглядней, есть калькулятор, такая схема 1++1 не приемлема. Т.е. ограничить ввод одинаковых значений два раза подряд.
Задача 2. Можно ли с помощью метода get(), выдрать значение text(тобишь название кнопки) из виджета Button()?
4kpt_II
1. Можно. Но нужно писать логику самому. Проста часть клавиш после нажатия одной и до нажатия других нужно блокировать.
2. Там все значительно проще. Для этого при запуске bind передается event. Посмотрите, что он может и зачем вообще используется.

P.S. Будут вопросы - пишите …
MetalHead
1. Логику продумать можно, надо бы посидеть подумать, уже что-то пришло в голову.
2. Не до конца понял, объясните, как можно получить таким образом значения? Я так понимаю событие это к примеру <Button-1>?
4kpt_II
Нет. 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. Будут вопросы - пишите …
4kpt_II
Логика там простая.
При нажатии клавиши Вы смотрите, нажата ли клавиша из группы операций (*, +, -). Если нажата, то просто блокируете все эти клавиши (клавиши группы операций). При нажатии на любую цифру
блокировка снимается. Т.е. делаете всегда циклом

but_operation["state"] = "normal"

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

but_operation["state"] = "disabled"

внутри обработчика операций… Вот и все
MetalHead
Благодарен. Про блокировку клавиш не доконца понял, с питоном знаком всего 4 месяца
4kpt_II
Представим, что пользователь нажимает на кнопки.
У Вас кнопки можно разделить на два типа:
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)

Тут я привел костяк. И только для двух кнопок. У Вас их будет значительно больше.
MetalHead
4kpt_II, ух как разжевано, спасибо, будут вопросы отпишусь.
4kpt_II
Не за что. Пишите, если что. Никаких проблем
MetalHead
Вопрос появился, вот моя задумка:
    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(), то действуют кнопочки +, -, *, /, иначе они не работать не будут. Самый простой выход, если я конечно правильно рассуждаю.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB