마우스 버튼으로 창을 클릭하면 해당 위치의 좌표를 저장하고 그 자리에 점을 찍어 주는 GUI 애플리케이션을 만들어야 하는 경우가 있습니다. 파이썬의 Tkinter는 키 입력이나 마우스 버튼 클릭과 같은 이벤트를 특정 함수에 연결(바인딩)하는 기능을 제공하므로, 이런 동작을 비교적 간단하게 구현할 수 있습니다.
구현 단계
클릭 이벤트가 발생했을 때 캔버스에 점을 그리려면 일반적으로 다음 순서로 작업합니다.
캔버스(Canvas) 위젯을 생성하고 창에 배치해 화면에 표시합니다.
사용자가 클릭했을 때 실행될 draw_dot() 함수를 정의합니다.
캔버스에서 발생한 클릭 횟수를 세는 전역 변수를 만듭니다.
응용하면 클릭 횟수가 두 번이 되었을 때 첫 번째 좌표와 두 번째 좌표 사이에 선을 그리도록 확장할 수도 있습니다.
마우스 버튼과 콜백 함수를 바인딩해 클릭 시 원하는 동작이 실행되도록 제어권을 넘깁니다.
예제 코드
# 필요한 라이브러리 임포트
from tkinter import *
from tkinter import ttk
# tkinter 프레임(윈도우) 인스턴스 생성
win = Tk()
# 윈도우 크기 설정
win.geometry("700x350")
# 클릭된 좌표에 점(타원)을 그리는 함수 정의
def draw_line(event):
x1 = event.x
y1 = event.y
x2 = event.x
y2 = event.y
# 지정한 좌표에 타원을 그려 점처럼 표현
canvas.create_oval(x1, y1, x2, y2, fill="black", width=20)
# 캔버스 위젯 생성
canvas = Canvas(win, width=700, height=350, background="white")
canvas.grid(row=0, column=0)
# 마우스 왼쪽 버튼 클릭(<Button-1>)과 함수 바인딩
canvas.bind('<Button-1>', draw_line)
click_num = 0
win.mainloop()
주요 코드 설명
- event.x, event.y : 클릭이 발생한 캔버스 내부의 x, y 좌표입니다.
- create_oval() : 타원을 그리는 메서드로, 시작점과 끝점을 같게 하고 선 두께(width)를 키우면 점처럼 표현됩니다.
- bind('<Button-1>', ...) : 마우스 왼쪽 버튼 클릭 이벤트를 draw_line 함수와 연결합니다.
- click_num : 클릭 횟수를 저장하는 변수로, 두 점을 잇는 선을 그리는 기능으로 확장할 때 활용할 수 있습니다.
실행 결과
위 코드를 실행하면 700×350 크기의 흰색 캔버스가 있는 창이 나타납니다. 캔버스 안을 마우스 왼쪽 버튼으로 클릭할 때마다 해당 위치에 검은색 점이 하나씩 찍히는 것을 확인할 수 있습니다.