강의노트 마우스 이벤트
강의노트
• 조회수 86
• 댓글 0
• 작성 4주 전
• 수정 4주 전
마우스 이벤트
GUI 프로그램에서 마우스를 클릭하거나 움직일 때 발생하는 동작을 나타낸다.
기본 구조
위젯에 마우스를 움직여서 이벤트를 발생시킨다.
def 이벤트처리함수(event):
# 처리 내용
위젯.bind("이벤트 작동", 이벤트처리함수)
주요 이벤트 동작
위젯에 마우스 포인터가 들어오거나 떠났을때의 이벤트
위젯에 들어왔을때 | 위젯을 떠났을때 | 움직일때 |
---|---|---|
< Enter > | < Leave > | < Motion > |
마우스 이벤트는 클릭할때, 클릭했다 떼었을때, 더블클릭할때, 드래그할때, 마우스가 위젯에 들어왔을때, 마우스가 위젯을 떠났을때 발생한다.
버튼 | 클릭했을때 | 클릭했다 떼었을때 | 더블 클릭 | 드래그할때 |
---|---|---|---|---|
모든 버튼을 클릭 | < Button > | < ButtonRelease > | < Double-Button > | |
왼쪽 버튼 | < Button-1 > | < ButtonRelease-1 > | < Double-Button-1 > | < B1-Motion > |
가운데 버튼(휠) | < Button-2 > | < ButtonRelease-2 > | < Double-Button-2 > | < B2-Motion > |
오른쪽버튼 | < Button-3 > | < ButtonRelease-3 > | < Double-Button-3 > | < B3-Motion > |
기본 예제
마우스 이벤트 결과
창을 만들고 창에 마우스를 클릭하였을 때의 이벤트 결과가 어떤지 살펴본다.
import tkinter as tk
def on_click(event):
print(event)
root = tk.Tk()
root.title("Mouse Event Example")
canvas = tk.Canvas(root, width=300, height=200, bg="lightyellow")
canvas.pack()
# 마우스 왼쪽 클릭 이벤트 연결
canvas.bind("< Button >", on_click)
root.mainloop()
위의 프로그램을 실행하면 밝은 노란색 창이 하나 뜨고 창의 아무곳이나 마우스 왼쪽 버튼을 클릭하면 이벤트가 발생하고 다음과 같은 결과가 나온다.
마우스 이벤트가 발생할 경우 event로 넘겨지는 결과는 " < 이벤트 유형, 상태, 버튼번호, 위치 > "와 같다.
여기서, 이벤트 유형은 ("이벤트 패턴"을 참조) 클릭, 드래그, 릴리즈등이 있으며, 상태는 어떤 키와 같이 눌렸는지를 확인한다. Alt, Ctl, Shift, NumLock키 들이 눌려있으면서 마우스가 클릭됐는지를 확인할 수 있다. 버튼 번호는 왼쪽버튼이 눌리면 1, 가운데 버튼 혹은 휠이 클릭되면 2, 오른쪽 버튼은 3, 휠 위로 스크롤하면 4 그리고 휠이 아래로 스크롤하면 5가 리턴된다. 위치는 x,y의 좌표를 리턴한다.
< ButtonPress event state=Mod1 num=1 x=165 y=79 >
마우스 클릭 좌표 출력
import tkinter as tk
def on_click(event):
print("클릭한 좌표:", event.x, event.y)
root = tk.Tk()
root.title("Mouse Event Example")
canvas = tk.Canvas(root, width=300, height=200, bg="lightyellow")
canvas.pack()
# 마우스 왼쪽 클릭 이벤트 연결
canvas.bind("< Button-1 >", on_click)
root.mainloop()
마우스 이동 따라가기
import tkinter as tk
def on_move(event):
label.config(text=f"좌표: ({event.x}, {event.y})")
root = tk.Tk()
root.title("Mouse Move Example")
label = tk.Label(root, text="마우스를 움직여 보세요", font=("Arial", 14))
label.pack(pady=20)
root.bind("< Motion >", on_move)
root.mainloop()
마우스 클릭 버튼 종류 구분하기
import tkinter as tk
def on_click(event):
if event.num == 1:
label.config(text="왼쪽 버튼 클릭!")
elif event.num == 2:
label.config(text="휠 클릭!")
elif event.num == 3:
label.config(text="오른쪽 버튼 클릭!")
root = tk.Tk()
root.title("Mouse Button Example")
label = tk.Label(root, text="마우스를 클릭해 보세요", font=("Arial", 14))
label.pack(pady=20)
root.bind("< Button >", on_click)
root.mainloop()
드래그로 그림 그리기
import tkinter as tk
def draw(event):
x, y = event.x, event.y
canvas.create_oval(x-2, y-2, x+2, y+2, fill="blue")
root = tk.Tk()
root.title("Mouse Drag Drawing")
canvas = tk.Canvas(root, width=400, height=300, bg="white")
canvas.pack()
# 왼쪽 버튼 누른 채 이동할 때 그림 그리기
canvas.bind("< B1-Motion >", draw)
root.mainloop()
연습문제
- 캔버스를 마우스 왼쪽 버튼을 클릭할 때마다 해당 위치에 빨간 원을 표시하시오.
정답 :
import tkinter as tk
def draw_circle(event):
x, y = event.x, event.y
canvas.create_oval(x-10, y-10, x+10, y+10, fill="red")
root = tk.Tk()
canvas = tk.Canvas(root, width=300, height=200, bg="white")
canvas.pack()
canvas.bind("< Button-1 >", draw_circle)
root.mainloop()
- 버튼에 마우스를 올리면 초록색, 벗어나면 기본색으로 되돌린다.
정답 :
import tkinter as tk
def on_enter(event):
btn.config(bg="green")
def on_leave(event):
btn.config(bg="SystemButtonFace")
root = tk.Tk()
btn = tk.Button(root, text="마우스를 올려보세요")
btn.pack(pady=20)
btn.bind("< Enter >", on_enter)
btn.bind("< Leave >", on_leave)
root.mainloop()
- 라벨을 더블클릭하면 "더블클릭했습니다!!!"라고 출력한다.
정답:
import tkinter as tk
def on_double(event):
label.config(text="더블클릭 했습니다!")
root = tk.Tk()
label = tk.Label(root, text="라벨을 더블클릭 해보세요", font=("Arial", 14))
label.pack(pady=20)
label.bind("< Double-1 >", on_double)
root.mainloop()
- 캔버스에서 드래그하면 시작점(마우스를 클릭)과 움직여서 끝점(마우스를 클릭한 버튼을 놓을때)을 기준으로 사각형을 그린다.
정답 :
import tkinter as tk
start_x, start_y = 0, 0
def on_press(event):
global start_x, start_y
start_x, start_y = event.x, event.y
def on_release(event):
x, y = event.x, event.y
canvas.create_rectangle(start_x, start_y, x, y, outline="blue")
root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=300, bg="white")
canvas.pack()
canvas.bind("< ButtonPress-1 >", on_press)
canvas.bind("< ButtonRelease-1 >", on_release)
root.mainloop()
로그인 하면 댓글을 쓸 수 있습니다.