tkinter 응용 프로그램은 대부분의 시간을 이벤트 루프에서 소모합니다. 즉 mainloop()에서 이벤트를 기다리면서 반복 루프를 실행합니다.
이것을 이벤트-구동 방식이라고 합니다.
이벤트는 다양한 소스에서 발생할 수 있습니다. 키보드의 키를 눌러도 이벤트가 발생되고 마우스 버튼을 눌러도 이벤트가 발생합니다.
윈도우 매니저가 화면을 다시 그리라는 이벤트를 보낼 수도 있습니다.
tkinter는 이벤트를 처리하는 강력한 메카니즘을 가지고 있습니다. 각 위젯에 대하여 개발자는 파이썬 함수를 붙일 수 있습니다.
위젯.bind(이벤트 지정자, 이벤트 처리 함수)
만약 위젯에서 이벤트 지정자와 일치하는 이벤트가 발생하면 주어진 이벤트 처리 함수가 이벤트를 설명하는 객체와 함께 호출됩니다.
간단한 예제를 봅시다. 마우스 이벤트를 받아서 파이썬 쉘에 출력해봅시다.
from tkinter import *
window = Tk()
def callback(event):
print(event.x, event.y, "에서 마우스 이벤트 발생")
frame = Frame(window, width = 100, height = 100)
frame.bind("<Button-1>", callback)
frame.pack()
window.mainloop()
<실행 결과>

36 51 에서 마우스 이벤트 발생
77 45 에서 마우스 이벤트 발생
83 75 에서 마우스 이벤트 발생
23 67 에서 마우스 이벤트 발생
이 예제에서 우리는 이라 불리는 이벤트에 콜백 함수 callback()을 연결하였습니다.
위의 프로그램을 실행하여 윈도우에서 마우스 버튼을 누르면 파이썬 쉘에 "32 44 에서 마우스 이벤트 발생" 과 같은 메시지가 출력됩니다.
키보드 이벤트는 현재 키보드 포커스를 소유하고 있는 위젯으로 보내집니다. focus_set() 메소드를 이용하여 원하는 위젯으로 포커스를 이동시킬 수 있습니다.
from tkinter import *
window = Tk()
def key(event):
print(repr(event.char), "가 눌렸습니다.")
def callback(event):
frame.focus_set()
print(event.x, event.y, "에서 마우스 이벤트 발생")
frame = Frame(window, width = 100, height = 100)
frame.bind("<Key>", key)
frame.bind("<Button-1>", callback)
frame.pack()
window.mainloop()
<실행 결과>

51 62 에서 마우스 이벤트 발생
'k' 가 눌렸습니다.
'a' 가 눌렸습니다.
35 53 에서 마우스 이벤트 발생
'' 가 눌렸습니다.
이벤트 지정자는 다음과 같은 형식의 문자열로 기술됩니다.
<수식어 - 타입 - 세부사항>
"타입" 필드는 이벤트 지정자의 가장 중요한 부분입니다. "타입"은 우리가 연결하고 싶어 하는 이벤트의 종류를 지정합니다.
Button, Key, Enter, Configure가 "타입" 이 될 수 있습니다. "수식어"와 "세부사항"은 이벤트에 대한 추가적인 정보를 제공하는 필드입니다.
이벤트 기술자를 단순화시키는 많은 방법이 있습니다. 예를 들면 키보드 키 이벤트를 매칭하기 위해서는 < ... > 을 생략하고 단순히 원하는 키를 입력하여도 됩니다.
가장 많이 사용되는 몇 개의 이벤트 지정자를 살펴봅시다.
하나의 예로 마우스 왼쪽 버튼이 단일 클릭 되거나 더블 클릭될 때 발생하는 이벤트를 처리하여 봅시다.
from tkinter import *
def sleft(event):
print("단일 클릭, 왼쪽 버튼")
def dleft(event):
print("더블 클릭, 왼쪽 버튼")
widget = Button(None, text = "마우스 클릭")
widget.pack()
widget.bind('', sleft) # 위젯과 이벤트 처리 함수를 연결합니다.
widget.bind('', dleft)
mainloop()
<실행 결과>

단일 클릭, 왼쪽 버튼
단일 클릭, 왼쪽 버튼
단일 클릭, 왼쪽 버튼
단일 클릭, 왼쪽 버튼
더블 클릭, 왼쪽 버튼
이번에는 마우스 모션 이벤트를 잡아서 처리해봅시다.
from tkinter import *
def motion(event):
print("마우스 위치 : (%s %s)" % (event.x, event.y))
return
window = Tk()
message = """커지는 Heart b-b-beat
빨라지는데
너답잖게 Heart b-b-b-beat
거려 나를 볼 때"""
msg = Message(window, text = message)
msg.config(bg = 'yellow', fg = 'blue', font = 'times 20 italic')
msg.bind('', motion)
msg.pack()
mainloop()
<실행 결과>

마우스 위치 : (166 123)
마우스 위치 : (162 105)
마우스 위치 : (161 94)
마우스 위치 : (161 89)
마우스 위치 : (160 84)
마우스 위치 : (159 79)
마우스 위치 : (159 77)
마우스 위치 : (158 77)
마우스 위치 : (158 75)
마우스 위치 : (158 74)
마우스 위치 : (156 72)
마우스 위치 : (154 68)
마우스 위치 : (153 65)
마우스 위치 : (152 63)
마우스 위치 : (152 62)
마우스 위치 : (152 61)
마우스 위치 : (152 60)
마우스 위치 : (152 59)
마우스 위치 : (152 57)
마우스 위치 : (152 56)
마우스 위치 : (152 55)
마우스 위치 : (152 54)
마우스 위치 : (153 54)
마우스 위치 : (152 54)
마우스 위치 : (150 51)
마우스 위치 : (148 48)
마우스 위치 : (144 43)
마우스 위치 : (141 38)
마우스 위치 : (137 33)
마우스 위치 : (128 26)
마우스 위치 : (118 17)
마우스 위치 : (111 11)
마우스 위치 : (106 6)
마우스 위치 : (104 5)
마우스 위치 : (104 4)
마우스 위치 : (103 3)
마우스 위치 : (103 2)
마우스 위치 : (102 1)
마우스 위치 : (102 0)
마우스 위치 : (98 11)
마우스 위치 : (97 20)
마우스 위치 : (97 30)
마우스 위치 : (97 36)
마우스 위치 : (96 47)
마우스 위치 : (94 57)
마우스 위치 : (93 66)
마우스 위치 : (90 77)
마우스 위치 : (86 91)
마우스 위치 : (79 106)
마우스 위치 : (75 118)
마우스 위치 : (68 132)
마우스 위치 : (61 145)
마우스 위치 : (56 154)
위젯을 만들 때 우리가 전달할 수 있는 모든 키워드 인수는 또한 configure() 메소드에 전달될 수 있습니다. 예를 들어 b1이라는 버튼이 있을 때 아래의 코드를 적용하면,
b1.configure(text = "새로운 버튼 텍스트")
버튼의 텍스트가 변경됩니다. 위젯의 속성을 변경할 때는 configure()를 사용합니다.
1. 사용자가 컴퓨터가 생성한 숫자(1부터 100 사이의 난수)를 알아맞히는 게임을 그래픽 사용자 인터페이스를 사용하여 제작해봅시다.
<실행 결과>



컴퓨터는 난수를 발생하여 정답으로 가지고 있습니다. 난수는 random.randint(1, 100) 문장으로 발생합니다.
사용자가 숫자인지를 입력하면 정답인지, 정답보다 높은지, 낮은지를 알려줍니다. 필요한 위젯을 생성하고 적절한 배치 관리자를 이용하여 위젯을 배치합니다.
"시도" 버튼과 "초기화" 버튼에 콜백 함수를 연결합니다.
2. 아이디와 패스워드를 입력할 수 있는 윈도우를 작성해봅시다. 아이디와 패스워드는 엔트리 위젯으로 구현되며 격자 배치 관리자를 이용하여 배치됩니다.
버튼에 적절한 함수를 연결하여 버튼 이벤트를 처리합니다.
<실행 결과>

아이디: 1323
패스워드 : 1323