"Life is too short, You need python"
command 및 bind method는 모두 Python의 tkinter 모듈을 사용하여 버튼 등 위젯에 생명과 기능을 추가하여 이벤트 처리를 하는 데 사용됩니다. UI의 수준이 기초 수준을 넘어섰다면 이벤트 처리는 필수입니다. command와 bind는 어떻게 동작하는지 비교해 보고 또 어떠한 차이가 있는지 알아보도록 하겠습니다.
Callback Function ( Event 처리 )
Mainloop 메서드는 loop를 돌리면서 창이 닫히지 않고 계속 떠 있을 수 있도록 합니다. 이 때 Event 발생 시 Event를 실행시키도록 할 수 있는 대표적인 방법이 command와 bind 입니다.
Callback Function ( 콜백 함수 )
Callback Function은 특정 이벤트가 발생하면 자동으로 호출(callback)되어 실행되는 함수를 가리킵니다. 즉, 연동 이벤트가 먼저 발생한 후에 실행되며, 이벤트가 발생하지 않으면 전혀 실행되지 않습니다. tkinter에서 위젯 이벤트와 콜백 함수를 연동하려면 command 인스턴스 속성이나 bind 인스턴스 메서드를 활용해야 합니다.
command Method
아래는 command 메서드를 많이 사용하게 되는 위젯 중 하나인 Button에서의 사용 예입니다.
옵션에서 정의된 함수를 불러올 수 있고, lambda(람다) 함수를 통해 command를 실행할 수도 있습니다.
import tkinter as tk
from tkinter.font import Font
class Pad(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.toolbar = tk.Frame(self)
self.toolbar.pack(side = "top", fill = "x")
self.clear_btn = tk.Button(self.toolbar, text = "Clear", command = self.clear)
self.clear_btn.pack(side = "left")
def clear(self):
self.text.tag_remove("BOLD", "1.0", 'end')
def demo():
root = tk.Tk()
root.mainloop()
if __name__ == "__main__":
demo()
command 인스턴스 속성에 콜백 함수를 지정하는 방식은 매우 편리하지만 다음 두 가지 한계를 갖습니다.
- 첫째, 모든 위젯이 command 속성을 활용한 콜백 함수 연동을 지원하지는 않습니다. 예를 들어, Button에서는 지원되지만, Frame, Lable 등은 command 속성을 지원하지 않습니다.
- 둘째, command 속성으로 연동할 수 있는 이벤트가 버튼 클릭 등 매우 제한적입니다. 예를 들어, 리턴(Return) 키를 누르는 이벤트와의 연동은 지원되지 않습니다.
반면 다음에 소개드릴 bind() 메서드를 활용한 방식은 command 속성 방식보다 훨씬 다양한 이벤트에 활용됩니다.
bind Method
특정 위젯과 콜백 함수를 연동하는 방식은 다음과 같습니다.
The syntax of the bind() method
widget.bind(event, handler, add = '')
- event : 이벤트 지정
- handler : 이벤트 처리기(핸들러)로 사용될 콜백 함수 지정
- 콜백 함수은 인자를 하나 받아야 한다. 그러면 실행될 때 발생한 이벤트가 자동으로 인자로 삽입된다.
- add : 기존에 연결된 콜백 함수 함께 실행 여부 결정
- add = '' : 기존 콜백 함수 연결 취소
- add = '+' : 기존에 콜백 함수와 함께 연결. 하지만 어떤 콜백 함수가 선택될지는 아무도 모름.
- Bind를 중복해서 사용하여도 모두 적용
- event.delta를 이용하여 마우스 휠의 delta값을 확인(event.delta 값이 + 일 경우 업 스크롤, - 일 경우 다운 스크롤)
from tkinter import *
def task(event):
print("Hello")
def quit(event):
print("Double click to stop")
import sys; sys.exit()
ws=Tk()
ws.title("Python guides")
ws.geometry("200x200")
button = Button(ws, text='Press')
button.pack(pady=10)
button.bind('<Button-1>', task)
button.bind('<Double-1>', quit)
button.mainloop()
< Event Type >
Type | Description | |
Button |
마우스 버튼 중 하나를 Click |
|
|
<Button-1> : 마우스 왼쪽 버튼 누를 때 | |
<Button-2> : 마우스 휠 버튼 누를 때 | ||
<Button-3> : 마우스 오르쪽 버튼 누를 때 | ||
<Button-4> : 스크롤 업 | ||
<Button-5> : 스크롤 다운 | ||
<MouseWheel> : 마우스 휠 이동 | ||
ButtonRelease |
버튼 Release. 실수로 버튼을 누르면 이벤트가 설정되지 않도록 위젯에서 마우스를 이동 |
|
|
<ButtonRelease-1> : 마우스 왼쪽 버튼 Release | |
<ButtonRelease-2> : 마우스 휠 버튼 Release | ||
<ButtonRelease-3> : 마우스 오른쪽 버튼 Release |
||
Motion |
위젯 내에서 마우스 포인터 이동 | |
|
<Motion> : 마우스 이동 | |
<B1-Motion> : 마우스 왼쪽 버튼 누른 상태로 이동 | ||
<B2-Motion> : 마우스 휠 버튼 누른 상태로 이동 | ||
<B3-Motion> : 마우스 오른쪽 버튼 누른 상태로 이동 | ||
DoubleClick | 마우스 더블 클릭 | |
|
<Double-Button-1> : 마우스 왼쪽 버튼 더블 클릭 시 | |
<Double-Button-2> : 마우스 휠 버튼 더블 클릭 시 | ||
<Double-Button-3> : 마우스 오른쪽 버튼 더블 클릭 시 | ||
KeyInput |
Key Press 시 | |
|
<Key> : 특정 Key 입력 시 ex) <R>, <F4>, <8> 등... | |
<Return> : Enter Key | ||
<Cancel> : Break Key | ||
<BackSpace> : BackSpace Key | ||
<Caps_Lock> : CapsLock Key | ||
<Prior> : Page Up Key | ||
<Up>, <Down>, <Right>, <Left> : 방향 Key | ||
<Shift-Key> : Shift + 특정 Key | ||
<Ctrl-Key> : Ctrl + 특정 Key | ||
<Alt-Key> : Alt + 특정 Key | ||
KeyRelease | Key를 뗄 때 | |
Activate / Deactivate | 위젯이 비활성에서 활성으로 변경 | |
Configure | 창의 모서리나 측면을 끌어 위젯의 모양 수정 시(크기 변경 등) |
|
Destroy | 위젯 객체 파괴 / 소멸 (종료) | |
Enter | 위젯의 보이는 부분으로 마우스 포인터 이동 ( ※ Enter 키와는 다릅니다 ) | |
Expose | 다른 창에 의해 가려진 후 애플리케이션이나 위젯의 적어도 일부가 표시될 때마다 발생합니다. | |
FocusIn | 위젯에 입력 포커스가 있습니다. ( 사용자 이벤트에 대한 응답으로 발생, Tab 등... ) | |
FocusOut | 입력 포커스가 위젯 밖으로 이동 ( 사용자 이벤트에 대한 응답으로 발생, Tab 등... ) | |
Leave | 사용자가 위젯 밖으로 마우스 포인터를 이동 | |
Map | 위젯 매핑. 즉, 애플리케이션에 표시됩니다. ex) .grid() 메서드를 호출 | |
Unmap | 위젯이 매핑 해제되고 더 이상 표시되지 않습니다. ex) .grid_remove() 메서드를 호출 | |
Visibility | 응용 프로그램 창의 적어도 일부가 화면에 표시될 때 발생 |
마무리
tkinter의 command와 bind에 대해 알아보았습니다.
'PYTHON > Tips' 카테고리의 다른 글
(5min. Python) Pandas 데이터 프레임(Dataframe) 터미널 출력 시 생략된 부분 보이게 설정 (0) | 2023.02.21 |
---|---|
(5min. Python) pandas dataframe 열(column) 삭제 (0) | 2022.09.27 |
(Python/Basic) Index 1부터 시작하고 싶을 때 ( start at 1 instead of 0 ) (0) | 2022.07.07 |
(5min. Python) 예시로 보는 정규 표현식(Regular Expressions) (0) | 2022.07.06 |
(5min. Python) 파이썬 정규 표현식 (Regular Expressions) - 메타문자(Meta Characters) 의미와 사용법 (0) | 2022.07.06 |