Python tkinter события клавиатуры

Tkinter
Examples

Events in tkinter are all the command inputs that can happen inside your application such as mouse movements / clicks, keyboard entries, window resizes, widget introduction, the list goes on. Generally there are two types of events, those which are built into a widget and those which are explicitly bound to a widget.

Implicit Events

Some widgets have events built into them such as the Button widget which takes a command= argument. When we click the button, the callable in our command parameter will be called. Some other widgets with built in event bindings (via command= ) are:

  • Checkbutton — called on selection
  • Radiobutton — called on selection
  • Scale — called on update (movement of scale widget)
  • Scrollbar — called on update (movement of scrollbar)
  • Spinbox — called on update (new value selected)

Explicitly-Bound Events

There are many events which can be bound to any widget with the syntax: widget.bind(«», callable_handler) . This causes the specified handler to get called whenever the event occurs. Note that we can also bind events to our container objects such as Tk, Frame, & TopLevel

Binding Options

There are multiple ways to bind events to widgets in tkinter :

  • .bind() — bind to the specific widget only (instance binding)
  • .bind_class() — bind to the all widgets of this class (class binding)
  • .bind_all() — bind across the whole application (application binding)
Читайте также:  Множество уникальных значений python

Be aware that .bind_class() can get in the way of default widget behavior since this is how tkinter itself implements default behaviors for widgets. The preferred method is creating a widget class that inherits from the base class and configures a bind on instantiation.

class BoundButton(tkinter.Button): def __init__(self, master, **kw): apply(tkinter.Button.__init__, (self, master), kw) self.bind("", lambda event: print(event)) 

Declaring Callables

When we declare callables to act as event handlers we should take note that the triggering event will pass an event object (see below) into our callable function. This means we should define our event handlers with one parameter. Implicit events sometimes have the additional argument.

def keyboard_handler(event): print(event.char) def mouse_handler(event): print(event.x, event.y) print(event.char) # prints ?? 

Note that we can also pass callables directly into the .bind() function using lambdas.

root.bind("k", lambda event: print("k was pressed!")) 

The Event Object

The event object passed into our event-handlers has many attributes. Some of the commonly used ones are:

  • widget — the widget which generated the event
  • type — the type of event this is (equal to inner text of the event specifier)
  • x, y — the position of the mouse relative to the bound widget (mouse events only)
  • num — the mouse button pressed (mouse events only)
  • char — the pressed key as a character literal (keyboard events only)
  • keycode, keysym — the pressed key as a code or symbol (keyboard events only)

Источник

Обработка событий и настройка окна / tkinter 4

Возможность реагировать на события — одна из базовых, но важных тем в приложениях с графическим интерфейсом. Именно она определяет, как пользователи смогут взаимодействовать с программой.

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

Некоторые события можно вызвать и без участия пользователя. Например, фокус ввода можно сместить с одного виджета на другой.

Выполнить привязку события к виджету можно с помощью метода bind . Следующий пример привязывает некоторые события мыши к экземпляру Frame :

 
import tkinter as tk

class App(tk.Tk):
def __init__(self):
super().__init__()
frame = tk.Frame(self, bg="green",
height=100, width=100)
frame.bind("", self.print_event)
frame.bind("", self.print_event)
frame.bind("", self.print_event)
frame.bind("", self.print_event)
frame.bind("", self.print_event)
frame.bind("", self.print_event)
frame.pack(padx=50, pady=50)

def print_event(self, event):
position = "(x=<>, y=<>)".format(event.x, event.y)
print(event.type, "event", position)

if __name__ == "__main__":
app = App()
app.mainloop()

Все события обрабатываются методом класса print_event() , который выводит тип события и положение мыши в консоли. Можете поэкспериментировать, нажимая на зеленую рамку мышью и двигая ею, пока она будет выводить сообщения события.

Обработка событий с мыши

Следующий пример содержит виджет поля ввода и несколько привязок. Одна из них срабатывает в тот момент, когда фокус оказывается в виджете, а вторая — при нажатии кнопки:

 
import tkinter as tk

class App(tk.Tk):
def __init__(self):
super().__init__()
entry = tk.Entry(self)
entry.bind("", self.print_type)
entry.bind("", self.print_key)
entry.pack(padx=20, pady=20)

def print_type(self, event):
print(event.type)

def print_key(self, event):
args = event.keysym, event.keycode, event.char
print("Знак: <>, Код: <>, Символ: <>".format(*args))

if __name__ == "__main__":
app = App()
app.mainloop()

В первую очередь программа выведет сообщение события FocusIn . Это произойдет в тот момент, когда фокус окажется в виджете Entry. Можно убедиться также в том, что события срабатывают и в случае с непечатаемыми символами, такими как клавиши стрелок или Backspace.

Как работает отслеживание событий

Метод bind определен в классе widget и принимает три аргумента: событие sequence , функцию callback и опциональную строку add :

 
widget.bind(sequence, callback, add='')

Строка sequence использует синтаксис .

Модификаторы являются опциональными и позволяют задать дополнительные комбинации для общего типа события:

  • Shift – когда пользователь нажимает клавишу Shift.
  • Alt – когда пользователь нажимает клавишу Alt.
  • Control – когда пользователь нажимает клавишу Control.
  • Lock – когда пользователь нажимает клавишу Lock.
  • Shift – когда пользователь нажимает клавишу Shift.
  • Shift – когда пользователь нажимает клавишу Shift lock.
  • Double – когда событие происходит дважды подряд.
  • Triple – когда событие происходит трижды подряд.

Типы события определяют общий тип события:

  • ButtonPress или Button – события, которые генерируются при нажатии кнопки мыши.
  • ButtonRelease – событие, когда кнопка мыши отпускается.
  • Enter – событие при перемещении мыши на виджет.
  • Leave – событие, когда мышь покидает область виджета.
  • FocusIn – событие, когда фокус ввода попадает в виджет.
  • FocusOut – событие, когда виджет теряет фокус ввода.
  • KeyPress или Key – событие для нажатия кнопки.
  • KeyRelease – событие для отпущенной кнопки.
  • Motion – событие при перемещении мыши.

detail – также опциональный параметр, который отвечает за определение конкретной клавиши или кнопки:

  • Для событий мыши 1 — это левая кнопка, 2 — средняя, а 3 — правая
  • Для событий клавиатуры используются сами клавиши. Если это специальные клавиши, то используется специальный символ: enter, Tab, Esc, up, down, right, left, Backspace и функциональные клавиши (от F1 до F12).

Функция callback принимает параметр события. Для событий мыши это следующие атрибуты:

  • x и y текущее положение мыши в пикселях
  • x_root и y_root то же, что и x или y, но относительно верхнего левого угла экрана
  • num – номер кнопки мыши

Для клавиш клавиатуры это следующие атрибуты:

  • char – нажатая клавиша в виде строки
  • keysym – символ нажатой клавиши
  • keycode – код нажатой клавиши

В обоих случаях у события есть атрибут widget , ссылающийся на экземпляр, который сгенерировал событие и type , определяющий тип события.

Рекомендуется определять метод для функции callback , поскольку всегда будет иметься ссылка на экземпляр класса, и таким образом можно будет легко получить доступ к атрибутам widget .

Наконец, параметр add может быть пустым ( "" ) для замены функции callback , если до этого была привязка или + для добавления функции обратного вызова и сохранения старых.

Помимо описанных типов событий есть и другие, которые оказываются полезными в определенных сценариях: например, генерируется при уничтожении виджета, а — при изменении размера или положения.

Полный список событий доступен в документации Tcl/Tk.

Настройка иконки, названия и размера основного окна

Экземпляр Tk отличается от обычных виджетов тем, как он настраивается. Рассмотрим основные методы, которые позволяют настраивать внешний вид.

Этот кусок кода создает основное окно с заданными названием и иконкой. Его ширина — 400 пикселей, а высота — 200. Плюс, есть разделение в 10px по каждой оси к левому верхнему углу экрана.

Источник

Tkinter
Examples

We often want to bind a widget to a key on our keyboard being pressed. The general case for this is using the event type.

import tkinter root = tkinter.Tk() def key_handler(event): print(event.char, event.keysym, event.keycode) root.bind("", key_handler) root.mainloop() 

This program outputs the following on a few key strokes. Note that for special characters the event.char attribute is empty.

j j 106 h h 104 7 7 55 6 6 54 . period 46 , comma 44 ; semicolon 59 Return 2359309 Caps_Lock 65536 Tab 3145737 

Key Presses

Binding to a specific key requires a very simple event specifier - the character of the key you want to bind to. Note that “space” and “

root.bind("z", lambda x: print("You pressed lowercase z")) root.bind("Z", lambda x: print("You pressed capital Z")) root.bind("3", lambda x: print("You pressed 3")) 

Key Sequences

tkinter gives us a very easy way to only call a handler if keys were pressed in a specific sequence. This takes advantage of how the .bind() method works, requiring a sequence of specifiers for the first argument:

root.bind("abc", lambda x: print("You pressed abc in that order")) root.bind("beef", lambda x: print("ooh yummy!")) 

Special Keys

There are some special keys that have distinct event bindings:

  • - The return / enter key
  • , , , - The arrow keys
  • , - The space and less than keys, respectively
  • , , - The up key was pressed while a modifier key was pressed

Keyboard Focus Events

The last thing we need to talk about regarding keyboard events is the “focus” events. These are triggered when keyboard focus has been moved to or from the specified widget. This focus is moved by using the focus_set() method on the widget.

  • - Keyboard focus was moved to this widget
  • - Keyboard focus was moved out of this widget

Источник

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