Метод bind tkinter python

Метод bind

В tkinter с помощью метода bind между собой связываются виджет, событие и действие. Например, виджет – кнопка, событие – клик по ней левой кнопкой мыши, действие – отправка сообщения. Другой пример: виджет – текстовое поле, событие – нажатие Enter , действие – получение текста из поля методом get для последующей обработки программой. Действие оформляют как функцию или метод, которые вызываются при наступлении события.

Использование метода bind

Один и тот же виджет можно связать с несколькими событиями. В примере ниже используется одна и та же функция-обработчик, однако могут быть и разные:

from tkinter import * root = Tk() def change(event): b['fg'] = "red" b['activeforeground'] = "red" b = Button(text='RED', width=10, height=3) b.bind('', change) b.bind('', change) b.pack() root.mainloop()

Здесь цвет текста на кнопке меняется как при клике по ней (событие ), так и при нажатии клавиши Enter (событие ). Однако Enter сработает, только если кнопка предварительно получила фокус. В данном случае для этого надо один раз нажать клавишу Tab . Иначе нажатие Enter будет относиться к окну, но не к кнопке.

У функций-обработчиков, которые вызываются через bind , а не через свойство command , должен быть обязательный параметр event , через который передается событие. Имя event – соглашение, идентификатор может иметь другое имя, но обязательно должен стоять на первом месте в функции, или может быть вторым в методе:

from tkinter import * root = Tk() class RedButton: def __init__(self): self.b = Button(text='RED', width=10, height=3) self.b.bind('', self.change) self.b.pack() def change(self, event): self.b['fg'] = "red" self.b['activeforeground'] = "red" RedButton() root.mainloop()

Что делать, если в функцию надо передать дополнительные аргументы? Например, клик левой кнопкой мыши по метке устанавливает для нее один шрифт, а клик правой кнопкой мыши – другой. Можно написать две разные функции:

from tkinter import * root = Tk() def font1(event): l['font'] = "Verdana" def font2(event): l['font'] = "Times" l = Label(text="Hello World") l.bind('', font1) # ЛКМ l.bind('', font2) # ПКМ l.pack() root.mainloop()

Но это не совсем правильно, так как код тела функций фактически идентичен, а имя шрифта можно передавать как аргумент. Лучше определить одну функцию:

def changeFont(event, font): l['font'] = font …

Однако возникает проблема, как передать дополнительный аргумент функции в метод bind ? Ведь в этот метод мы передаем объект-функцию, но не вызываем ее. Нельзя написать l.bind(», changeFont(event, «Verdana»)) . Потому что как только вы поставили после имени функции скобки, значит вызвали ее, то есть заставили тело функции выполниться. Если в функции нет оператора return , то она возвращает None . Поэтому получается, что даже если правильно передать аргументы, то в метод bind попадет None , но не объект-функция.

Читайте также:  Локальное приложение на python

На помощь приходят так называемые анонимные объекты-функции Python, которые создаются инструкцией lambda . Применительно к нашей программе выглядеть это будет так:

… l.bind('', lambda e, f="Verdana": changeFont(e, f)) l.bind('', lambda e, f="Times": changeFont(e, f))

Лямбда-функции можно использовать не только с методом bind , но и опцией command , имеющейся у ряда виджет. Если функция передается через command , ей не нужен параметр event . Здесь обрабатывается только одно основное событие для виджета – клик левой кнопкой мыши.

У меток нет command , однако это свойство есть у кнопок:

from tkinter import * def change_font(font): label['font'] = font root = Tk() label = Label(text="Hello World") label.pack() Button(command= lambda f="Verdana": change_font(f))\ .pack() Button(command= lambda f="Times": change_font(f))\ .pack() root.mainloop()

Практическая работа

Напишите программу по следующему описанию. Нажатие Enter в однострочном текстовом поле приводит к перемещению текста из него в список (экземпляр Listbox ). При двойном клике ( ) по элементу-строке списка, она должна копироваться в текстовое поле.

Курс с примерами решений практических работ: pdf-версия

Tkinter. Программирование GUI на Python

Источник

Метод bind tkinter python

Tkinter позволяет обрабатывать события виджетов. Для обработки распространенных и наболее используемых событий Tkinter предоставляет интерфейс команд. Например, для обработки нажатия на кнопку ее параметру command надо передать функцию, которая будет вызываться при нажатии на кнопку

def click(): print("Hello") btn = ttk.Button(text="Click", command=click)

Ряд виджетов также позволяют с помощью параметра command задать обработчик для одного из событий данного виджета.

Однако что, если мы хотим обрабатывать другие события виджета. Например, для кнопки обработать получение фокуса, или обработать нажатие клавиши клавиатуры? Для подобных ситуаций Tkinter предоставляет ряд встроенных событий. Наиболее распространенные из них:

  • Activate : окно становится активным.
  • Deactivate : окно становится неактивным.
  • MouseWheel : прокрутка колеса мыши.
  • KeyPress : нажатие клавиши на клавиатуре.
  • KeyRelease : освобождение нажатой клавиши
  • ButtonPress : нажатие кнопки мыши.
  • ButtonRelease : освобождение кнопки мыши.
  • Motion : движение мыши.
  • Configure : изменение размера и положения виджета
  • Destroy : удаление виджета
  • FocusIn : получение фокуса
  • FocusOut : потеря фокуса.
  • Enter : указатель мыши вошел в пределы виджета.
  • Leave : указатель мыши покинул виджет.

Привязка событий

Для привязки события к виджету применяется метод bind() :

В качестве первого параметра указывается обрабатываемое событие, а в качестве второго — функция, которая обрабатывает событие.

Например, обработаем события получения и потери фокуса для кнопки:

from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def entered(event): btn["text"] ="Entered" def left(event): btn["text"] ="Left" btn = ttk.Button(text="Click") btn.pack(anchor=CENTER, expand=1) btn.bind("", entered) btn.bind("", left) root.mainloop()

Название событие передается в угловных скобках, например, «» или «». Для события Enter (получение фокуса) определен обработчик-функция entered, которая изменяет текст кнопки:

def entered(event): btn["text"] ="Entered"

Стоит обратить внимание, что функция обработки события должна принимать в качестве параметра объект события — в примере выше параметр event, даже если он в самой функции не используется.

Событие потери фокуса связывыется с функцией left:

Привязка событий в виджетах к функциям в tkinter и python

Кроме обычных событий некоторые виджеты Tkinter могут использовать виртуальные события или высокоуровневые события (выше были описаны низкоуровневые события), которые помещаются в двойные угловные скобки, например, событие выделения списка «>». Наиболее используемые виртуальные события будут рассмотрены в соответствующих темах про виджеты.

Шаблон события

В примере выше при привязке события указывалось только имя события например, «» или «». Но в реальности в фигурных скобках указывается не просто имя события, а его шаблон. Шаблон события имеет следующую форму:

Модификаторы события

Часто используемые модификаторы:

  • Alt : нажата клавиша Alt
  • Control : нажата клавиша Ctrl
  • Shift : нажата клавиша Shift
  • Any : нажата любая клавиша

Клавиши

Также в шаблоне можно указать конкретные клавиши или комбинации. Некоторые из них:

  • Alt_L : правая клавиша alt
  • Alt_R : правая клавиша alt
  • BackSpace : клавиша backspace
  • Cancel : клавиша break
  • Caps_Lock клавиша CapsLock
  • Control_L : левая клавиша control
  • Control_R : правая клавиша control
  • Delete : клавиша Delete
  • Down : клавиша ↓
  • End : клавиша end
  • Escape : клавиша esc
  • Execute : клавиша SysReq
  • F1 : клавиша F1
  • F2 : клавиша F2
  • Fi : функциональная клавиша Fi
  • F12 : клавиша F12
  • Home : клавиша home
  • Insert : клавиша insert
  • Left : клавиша >←
  • Linefeed : клавиша Linefeed (control-J)
  • KP_0 : клавиша 0
  • KP_1 : клавиша 1
  • KP_2 : клавиша 2
  • KP_3 : клавиша 3
  • KP_4 : клавиша 4
  • KP_5 : клавиша 5
  • KP_6 : клавиша 6
  • KP_7 : клавиша 7
  • KP_8 : клавиша 8
  • KP_9 : клавиша 9
  • KP_Add : клавиша +
  • KP_Begin : центральная клавиша (5)
  • KP_Decimal : клавиша точка ( . )
  • KP_Delete : клавиша delete
  • KP_Divide : клавиша /
  • KP_Down : клавиша ↓
  • KP_End : клавиша end
  • KP_Enter : клавиша enter
  • KP_Home : клавиша home
  • KP_Insert : клавиша insert
  • KP_Left : клавиша ←
  • KP_Multiply : клавиша ×
  • KP_Next : клавиша PageDown
  • KP_Prior : клавиша PageUp
  • KP_Right : клавиша →
  • KP_Subtract : клавиша —
  • KP_Up : клавиша ↑
  • Next : клавиша PageDown
  • Num_Lock : клавиша NumLock
  • Pause : клавиша pause
  • Print : клавиша PrintScrn
  • Prior : клавиша PageUp
  • Return : клавиша Enter
  • Right : клавиша →
  • Scroll_Lock : клавиша ScrollLock
  • Shift_L : левая клавиша shift
  • Shift_R : правая клавиша shift
  • Tab : клавиша tab
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def single_click(event): btn["text"] ="Single Click" def double_click(event): btn["text"] ="Double Click" btn = ttk.Button(text="Click") btn.pack(anchor=CENTER, expand=1) btn.bind("", single_click) btn.bind("", double_click) root.mainloop()

Здесь в шаблоне «» ButtonPress — название события — нажатие кнопки мыши, а «1» указывает на конкретную кнопку — левую кнопку мыши (например, 3 — представляет правую кнопку)

А в шаблоне «» лобавляется модификатор Doubles , который указывает на двойное нажатие.

Глобальная регистрация события

В примерах выше обработка события устанавливалась для одного конкретного объекта — для одной кнопки. Но что, если у нас много кнопок и мы хотим, чтобы для всех была установлена привязка одного и тоже события с одной и той же функцией_обработчиком? В этом случае мы можем установить привязку события глобально ко всем объектам класса с помощью метода bind_class класса Tk:

from tkinter import * from tkinter import ttk clicks = 0 root = Tk() root.title("METANIT.COM") root.geometry("250x200") def clicked(event): global clicks clicks = clicks + 1 btn["text"] =f" Clicks" btn = ttk.Button(text="Click") btn.pack(anchor=CENTER, expand=1) # привязка события к кнопкам ttk.Button root.bind_class("TButton", "", clicked) root.mainloop()

В данном случае для кнопок для обработки двойного нажатия установаливается обработчик — функция clicked. Причем события привязывается к кнопкам из пакета tkinter.ttk, поэтому в типа виджетов качестве используется «TButton» (а не просто Button).

Удаление события

Для открепления события от виджета вызывается метод unbind() , в который передается шаблон события:

Источник

Оцените статью