Python tkinter bind клавиши

Tkinter Key Binding | Handling Keyboard Events

Key Binding in Tkinter is a valuable still that will help you in creating complex GUI applications. The concept is simple. You “bind” a specific Key, or type of key to a functions that executes when that key is pressed.

Form

The below code demonstrates how to use almost all of the main key bindings in Tkinter. We have a small breakdown and code explanation here in this tutorial, but I do recommend you check out our Video Tutorial for Tkinter Key Bindings. In it, we recreate the below code from scratch, explaining each step in detail along the way.

import tkinter as tk class MainWindow: def __init__(self, master): self.master = master self.usernames = ["Player1", "CodersLegacy", "Knight"] self.frame = tk.Frame(self.master, width = 300, height = 300) self.frame.pack() self.label = tk.Label(self.frame, text = "This is some sample text") self.label.place( x = 80, y = 20) self.button = tk.Button(self.frame, text = "Button") self.button.place( x = 120, y = 80) self.entry = tk.Entry(self.frame) self.entry.place( x = 80, y = 160) self.entry2 = tk.Entry(self.frame) self.entry2.place( x = 80, y = 200) self.bindings() def bindings(self): self.master.bind('a', lambda event: print("A was pressed")) self.frame.bind('', lambda event: print("Entered Frame")) self.label.bind('', lambda event: print("Mouse clicked the label")) self.button.bind('', lambda event: self.color_change(self.button, "green")) self.button.bind('', lambda event: self.color_change(self.button, "black")) self.entry.bind('', lambda event: self.pass_check()) self.entry.bind('', lambda event: self.Focused_entry()) self.entry.bind('', lambda event: self.UnFocused_entry()) def color_change(self, widget, color): widget.config(foreground = color) def pass_check(self): text = self.entry.get() for username in self.usernames: if text == username: print("Username taken") def Focused_entry(self): print("Focused (Entered) the entry widget") def UnFocused_entry(self): print("UnFocused (Left) the entry widget")

Explanation

In this section, we’ll explain each of the key bindings we used in the code above.

Читайте также:  Пробел и табуляция html

Note: The reason we use lambdas, is so that we can pass parameters into the function that gets called. The function that you pass into the second parameter of bind() should not have any brackets. Hence the lambdas is a way to work around this limitation. (This issue arises because you need a function name in bind() , not a function call. print(value) is a call, while print is a name).

self.master.bind('a', lambda event: print("A was pressed"))

The above code will print out “A was pressed” to the screen, if the “a” key is pressed. We can bind any key in this manner, such as “b”, “c”, “1” etc.

self.frame.bind('', lambda event: print("Entered Frame"))

In the above code, we print out “Entered Frame”, if the mouse cursor moves over the frame. Try running the code to see it properly.

self.label.bind('', lambda event: print("Mouse clicked the label"))

The above code will cause Tkinter to print out a message, if we click on the label with the mouse.

self.button.bind('',lambda event: self.color_change(self.button,"green")) self.button.bind('',lambda event: self.color_change(self.button,"black"))

The above code creates the hover effect. If you “enter” the button with your cursor, then it will change color to green. If to leaves the button, it will change the color back to black.

self.entry.bind('', lambda event: self.pass_check()) self.entry.bind('', lambda event: self.Focused_entry()) self.entry.bind('', lambda event: self.UnFocused_entry())

This code has two purposes. The bind, keeps checking to see if the username already exists. Each time you enter a new key, it checks the entered username with the list of existing usernames by calling the pass_check() function.

The other two bindings check to see if the entry widget is under focus or not. If you click on the Entry widget, the Focused_entry() function will call. If you select some other widget like another entry, then it will become defocused and call the UnFocused_entry() function.

List of Key Bindings

Here is a list of key bindings in Tkinter. Remember, you can attach these to any widget, not just the Tkinter window.

Video

Another really interesting use of the Key binding feature, is in this video of ours. Here we made a Syntax highlighter using the Text Widget, which relies on Key bindings to actually call the function responsible for coloring the special keywords and commands.

This marks the end of the Tkinter Key Binding Tutorial. Any suggestions or contributions for CodersLegacy are more than welcome. Questions regarding the tutorial content can be asked in the comments section below.

Источник

Метод 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, которые создаются инструкцией 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

Источник

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