윈도우 프로그램 이벤트

강의노트 마우스 이벤트

강의노트 • 조회수 85 • 댓글 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()

연습문제

  1. 캔버스를 마우스 왼쪽 버튼을 클릭할 때마다 해당 위치에 빨간 원을 표시하시오.

정답 :

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()
  1. 버튼에 마우스를 올리면 초록색, 벗어나면 기본색으로 되돌린다.

정답 :

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()
  1. 라벨을 더블클릭하면 "더블클릭했습니다!!!"라고 출력한다.

정답:

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()
  1. 캔버스에서 드래그하면 시작점(마우스를 클릭)과 움직여서 끝점(마우스를 클릭한 버튼을 놓을때)을 기준으로 사각형을 그린다.

정답 :

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()
이전 글
다음 글
댓글
댓글로 소통하세요.