파이썬 (Python) _ 가을 학기 9주 차
지난 시간에는 '이미지 뷰어'에 필요한 기능들을 대부분 구현해 봤습니다. 이번 시간에는 마우스/키보드의 이벤트 처리와 속성들에 대해 알아본 후, '이미지 뷰어' 프로그램에 구현해 보도록 하겠습니다.
pLabel.bind("<Button>", clickImage)
bind 메서드는 위젯에 '이벤트가 발생했을 때 실행되는 메서드'로 위젯을 클릭하고 키를 누르는 등 여러 작동에 따른 이벤트를 감지하여 이벤트와 연결된 함수가 호출되는 방식입니다.
| 마우스 작동 | 마우스 버튼 | 이벤트 코드 |
| 클릭할 때 | 모든 버튼 공통 | <Button> |
| | 왼쪽 버튼 | <Button-1> |
| | 가운데 버튼 | <Button-2> |
| | 오른쪽 버튼 | <Button-3> |
| 떼었을 때 | 모든 버튼 공통 | <ButtonRelease> |
| | 왼쪽 버튼 | <ButtonRelease-1> |
| | 가운데 버튼 | <ButtonRelease-2> |
| | 오른쪽 버튼 | <ButtonRelease-3> |
| 더블클릭할 때 | 모든 버튼 공통 | <Double-Button> |
| | 왼쪽 버튼 | <Double-Button-1> |
| | 가운데 버튼 | <Double-Button-2> |
| | 오른쪽 버튼 | <Double-Button-3> |
| 드래그할 때 | 왼쪽 버튼 | <B1-Motion> |
| | 가운데 버튼 | <B2-Motion> |
| | 오른쪽 버튼 | <B3-Motion> |
| 마우스 커서가 위젯 위로 올라왔을 때 | <Enter> | |
| 마우스 커서가 위젯에서 떠났을 때 | <Leave> |
마우스 이벤트 처리에 대해 살펴보자면, 마우스 클릭할 때, 마우스를 떼었을 때, 더블 클릭을 할 때, 드래그할 때, 마우스 커서가 위젯 위로 올라갈 때, 혹은 위젯을 벗어났을 때와 같이 마우스 작동과 관련한 다양한 이벤트를 감지하고 있습니다. 예를 들어 <Button-1> 이벤트가 발생하기 위해서는 마우스 왼쪽 버튼으로 위젯을 클릭해야 합니다.
pLabel.bind("<Button>", clickImage)
해당 코드에서는 <Button> 이벤트가 발생하게 된다면 clickImage 함수가 호출됩니다. 이렇게 이벤트가 발생했을 때 호출될 함수를 handler라고 부르게 되며 <Button>과 같이 이벤트의 종류를 나타내는 문자열은 sequence라고 부릅니다.
from tkinter import messagebox
def clickImage(event) : messagebox.showinfo("마우스", "마우스가 클릭됨")
pLabel.bind("<Button>", clickImage)
코드를 살펴보게 되면 <Button> 이벤트가 발생하면 clickImage 함수가 호출되어 "마우스가 클릭됨"이라는 메시지 박스 정보 창이 출력되는 코드를 만들어 봤습니다. 여기서 event는 Tkinter가 이벤트가 발생했을 때 핸들러(clickImage)에 전달하는 객체입니다. event에는 발생한 이벤트에 대한 모든 정보가 저장되어 있습니다.
| 속성 | 의미 | 예시/설명 |
| event.num | 눌린 마우스 버튼 번호 | 1=왼쪽, 2=가운데, 3=오른쪽, 4=휠 위, 5=휠 아래 |
| event.x | 위젯 기준 x 좌표 | 클릭한 위치의 x 픽셀 |
| event.y | 위젯 기준 y 좌표 | 클릭한 위치의 y 픽셀 |
| event.x_root | 화면 기준 x 좌표 | 모니터 전체 화면 기준의 x 좌표 |
| event.y_root | 화면 기준 y 좌표 | 모니터 전체 화면 기준의 y 좌표 |
| event.widget | 이벤트 발생 위젯 객체 | Label, Button 등 이벤트가 발생한 위젯 참조 |
| event.type | 이벤트 타입 | ButtonPress, ButtonRelease 등 |
| event.state | Shift, Ctrl, Alt 키 상태 | 이벤트 발생 시 어떤 수정 키가 눌렸는지 |
| event.delta | 휠 이벤트 이동량 | Windows에서 마우스 휠 스크롤 양 |
위 표는 이벤트 종류에 따른 이벤트 속성들을 보여주고 있습니다. event.x와 event.y는 마우스가 클릭했을 때의 x, y 픽셀 좌표를 나타내며 event.num에는 마우스가 어떻게 눌렸는지(왼쪽 클릭, 오른쪽 클릭 등)에 대한 정보를 담고 있습니다.
![[마곡 코딩] 파이썬 11월 7일 금요일 7시 수업_ tkinter(이미지 뷰어) 3차시 사진 1](/blog/224070998886/001.png)
이러한 속성들을 활용해 왼쪽 위에 label 위젯을 사용하여 눌린 마우스에 대한 정보가 출력되도록 만들어 봤습니다.
| 이벤트 | 설명 |
| <Key> 또는 <KeyPress> | 아무 키나 눌렀을 때 |
| <KeyRelease> | 키를 뗐을 때 |
| <Return> | Enter 키 |
| <BackSpace> | Backspace 키 |
| <Tab> | Tab 키 |
| <Escape> | Esc 키 |
| <Shift_L> / <Shift_R> | 왼쪽/오른쪽 Shift |
| <Control_L> / <Control_R> | 왼쪽/오른쪽 Ctrl |
| <Alt_L> / <Alt_R> | 왼쪽/오른쪽 Alt |
| <Up> / <Down> / <Left> / <Right> | 방향키 |
| <F1> ~ <F12> | 기능키 |
마우스 이벤트 외에도, 키보드 이벤트 처리도 알아봤습니다. 마우스와 비슷하게, 키보드의 특정한 키를 눌렀을 때 이벤트가 발생하도록 만들 수 있어, window 창 내에서 키보드를 입력하게 되면 입력된 키보드에 대한 정보가 출력되도록 코드를 작성해 봤습니다.
이렇게 이번 시간에는 이벤트 처리와 event 속성을 활용한 코딩을 진행해 봤습니다. 다음 시간에는 새로운 위젯에 대해 배워보도록 하겠습니다~
![[마곡 코딩] 파이썬 11월 7일 금요일 7시 수업_ tkinter(이미지 뷰어) 3차시 사진 2](/blog/224070998886/002.jpg)
#마곡역 코딩 학원 #신방화역코딩학원 #유아코딩 #공항초 #공진초 #코드페어 #송화초 #초딩코딩 #AI #대회 #마곡나루맛집 #신방화역학원 #코딩학원 #소프트웨어 #대회준비 #VR #올림피아드 #엔트리 #신방화역맛집 #신방화역카페 #라온lc #laonlc #엔트리 #coding #파이썬 #스크래치