Языки программирования

Библиотека Tkinter: События

Метод bind() привязывает событие к какому-либо действию (нажатие кнопки мыши, нажатие клавиши на клавиатуре и т.д.). bind принимает три аргумента:

  • название события;
  • функцию, которая будет вызвана при наступлении события;
  • третий аргумент (необязательный) — строка «+» — означает, что эта привязка добавляется к уже существующим. Если третий аргумент опущен или равен пустой строке — привязка замещает все другие привязки данного события к виджету.

Синтаксис связывания:
виджет.bind(событие, функция)

Типы событий

При вызове метода bind() событие передается в качестве первого аргумента. Название события заключается в кавычки, а также в знаки < и >. Событие описывается с помощью зарезервированных последовательностей ключевых слов.

События мыши

К событиям мыши относятся следующие события (часто используемые):
  • <Button-1> — щелчок левой кнопки мыши.
  • <Button-2> — щелчок средней кнопки мыши.
  • <Button-3> — щелчок правой кнопки мыши.
  • <Double-Button-1> — двойной клик левой кнопки мыши.
  • <Motion> — движение мыши.
Пример программы с событиями мыши:
from tkinter import *

def b1(event):
  root.title("Левая кнопка мыши")
  
def b3(event):
  root.title("Правая кнопка мыши")

def move(event):
  root.title("Движение мышью") 
  
# создаем главное окно программы
root = Tk()
root.title("Заголовок окна программы")
root.minsize(width=500, height=400)

root.bind('<Button-1>', b1)
root.bind('<Button-3>', b3)
root.bind('<Motion>', move)

root.mainloop()

События клавиатуры

К событиям клавиатуры относят следующие:
  • Нажатия буквенных клавиш, которые записываются без угловых скобок, например ‘A’;
  • Нажатия комбинаций клавиш — пишутся через тире, например, <Control-Shift>
  • Для неалфавитных клавиш есть специальные зарезервированный слова:
  • <Return> — Enter;
  • <space> — пробел;
  • <Shift> — Shift;
  • <Alt> — Alt;
  • <Control> — Ctrl;
  • и т.д.
Для примера напишем небольшую программу. В окне будет поле ввода и метка. При нажатии Enter метод caption будет устанавливать текст метки-по введенному в поле тексту.
При нажатии Ctrl + Z будет произведен выход(вызван метод destroy() для основного окна, что означает выход из программы). Листинг:
from tkinter import *

def exit_(event):
  root.destroy()
  
def caption(event):
  t = ent.get()
  lbl.configure(text = t)
  
root = Tk()
root.title("Заголовок окна программы")
root.minsize(width=500, height=400)

# Создаем виджеты
ent = Entry(root, width = 100)
lbl = Label(root, width = 100)

# Располагаем виджеты
ent.pack()
lbl.pack()

ent.bind('<Return>', caption)
root.bind('<Control-z>', exit_)

root.mainloop()
Вывод программы:
Видео по теме:

Программа «Просмотрщик файлов»

Для закрепления теоретического материала напишем небольшую программу, которая будет выводить содержимое текстового файла в многострочное поле для ввода текста. Программа будет состоять всего из трех виджетов:
  • Поле ввода — в него нужно ввести имя файла;
  • Кнопка;
  • Многострочное поле ввода — в него будет загружаться содержимое файла при нажатии кнопки.
Листинг программы:
from tkinter import *

def output(event):
  # получаем содержимое текстового поля
  s = ent.get()
  try:
    txt = open(s, "r", encoding="utf-8")
    content = txt.read()
    tex.delete(1.0, END)
    tex.insert(END, content)
  except:
    tex.delete(1.0, END)
    tex.insert(END, "Файл не существует!")
    
root = Tk()
root.title("Просмотрщик файлов")
root.minsize(width=500, height=400)

# создаем виджеты
ent = Entry(root, width=20)
but = Button(root, text="Открыть")
tex = Text(root, width=80, height=30, font="Courier 14", wrap=WORD)
tex.insert(END, "Введите имя текстового файла и нажмите кнопку Открыть")

# распологаем виджеты в окне программы
ent.grid(row=0, column=0)
but.grid(row=2, column=0)
tex.grid(row=1, column=0)

# устанавливаем обработчик событий
but.bind("<Button-1>", output)

# запускаем программу
root.mainloop()
Программа работает так:

  • После запуска она ждет пока пользователь введет имя файла и нажмет кнопку «Открыть». Имя файла будет получено из переменной ent.
  • Если файл существует, его содержимое будет загружено в виджет tex.
  • Если файл не существует, в tex будет загружено соответствующее сообщение.

Метод delete() очищает текущее содержимое.

Метод insert() добавляет новое содержимое.

1.0 означает первую строку и первый символ (нумерация символов начинается с 0), END — последний символ.

Расположением виджетов в окне программы «занимается» сетка — grid.

Вывод программы:
Видео по созданию программы:
Библиотека Tkinter