250x250
250x250
  • 분류 전체보기 (48)
    • Save Your TIME (1)
      • WORK SMART - RPA (0)
      • 비 전공 직장인의 업무 자동화 고군분투기 (1)
    • Make a lot of MONEY (0)
      • 부동산 (0)
    • PYTHON (45)
      • BASIC (3)
      • pandas (3)
      • tkinter (8)
      • LIBRARY | ETC (1)
      • Tips (19)
      • Error Solutions (11)
    • EXCEL (0)
      • BASIC (0)
      • TIP (0)
    • Life & Education (2)
      • 초등 수학 (2)
      • English (0)
    • TISTORY (0)
      • ABOUT BLOG (0)
      • TIP (0)
    • Reference (0)
hELLO · Designed By 정상우.
Creatio ex nihilo

Py Life

(5min. Python) tkinter event 처리 ( command / bind )
PYTHON/Tips

(5min. Python) tkinter event 처리 ( command / bind )

2022. 7. 8. 18:27
728x90
반응형

"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에 대해 알아보았습니다.

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'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
    Creatio ex nihilo
    Creatio ex nihilo
    "Life is too short, You need python"

    티스토리툴바