Обработчик нажатия кнопки питон

Обработка событий и настройка окна / 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 кнопки представлены классом Button . Основные параметры виджета Button:

  • command : функция, которая вызывается при нажатии на кнопку
  • compund : устанавливает расположение картинки и текста относительно друг друга
  • cursor : курсор указателя мыши при наведении на метку
  • image : ссылка на изображение, которое отображается на метке
  • pading : отступы от границ вилжета до его текста
  • state : состояние кнопки
  • text : устанавливает текст метки
  • textvariable : устанавливает привязку к элементу StringVar
  • underline : указывает на номер символа в тексте кнопки, который подчеркивается. По умолчанию значение -1, то есть никакой символ не подчеркивается
  • width : ширина виджета

Добавим в окно обычную кнопку из пакета ttk:

from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") # стандартная кнопка btn = ttk.Button(text="Button") btn.pack() root.mainloop()

Для создания кнопки используется конструктор Button() . В этом конструкторе с помощью параметра text можно установить текст кнопки.

Чтобы разместить виджет в контейнере (главном окне), у него вызывается метод pack() . На ОС Windows мы получим следующую кнопку:

Кнопка в tkinter в Python

Конструктор Button определяет различные параметры, которые позволяют настроить поведение и внешний вид кнопки. Однако конкретный набор параметров зависит от того, используем ли мы кнопки из пакета tkinter или из пакета tkinter.ttk.

Обработка нажатия на кнопку

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

from tkinter import * from tkinter import ttk clicks = 0 def click_button(): global clicks clicks += 1 # изменяем текст на кнопке btn["text"] = f"Clicks " root = Tk() root.title("METANIT.COM") root.geometry("250x150") btn = ttk.Button(text="Click Me", command=click_button) btn.pack() root.mainloop()

Здесь в качестве обработчика нажатия устанавливается функция click_button. В этой функции изменяется глобальная переменная clicks, которая хранит число кликов. Кроме того, изменяем текст кнопки, чтобы визуально было видно сколько нажатий произведено. Таким образом, при каждом нажатии кнопки будет срабатывать функция click_button, и количество кликов будет увеличиваться:

Обработка нажатия кнопки в tkinter и Python

Отключение кнопки

Для ttk-кнопки мы можем установить отключенное состояние с помощью метода state() , передав ему значение "disabled". С такой кнопкой пользователь не сможет взаимодействовать:

from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") btn = ttk.Button(text="Click Me", state=["disabled"]) btn.pack() root.mainloop()

При этом в метод state мы можем передать набор состояний, поэтому значение "disabled" передается внутри списка.

Источник

Читайте также:  Php добавить строку файл
Оцените статью