안녕하세요~~~
정말 정말 오랜만이네요 여러분~~
그동안 왕초보 파이썬 책을 쓰느라고 온라인 강좌를 전혀 못 올려서 죄송하네요. 많이 아쉬우셨죠?
저도 여러분을 게시판으로만 만나는 것이 무척 아쉬웠답니다.
컴백하고서 첫 강좌의 주제는 Tkinter에서 마우스 입력을 처리하는 방법이예요. 제가 요즘 학교 공부하느라고 Visual C++로 윈도우 프로그래밍하는 방법을 배우고 있는데, 재미있는 것이 있길래 파이썬으로 다시 만들어 봤거든요. 이 강좌를 이해하시려면 Tkinter에 대해서 약간 알고 계셔야하니까요, 아직 안 써보신 분은 python.or.kr의 GUI 강좌를 한 번 따라해보신 다음에 읽어보세요.
GUI 환경에서는 키보드를 눌렀다든지, 마우스를 클릭했다든지 하는 것들을 이벤트(event, 사건)이라고 하지요. 이러한 이벤트는 언제 발생할 지 알 수 없으니까 컴퓨터는 항상 쪼그리고 앉아서 이벤트가 발생하기를 기다리고 있다가, 이벤트가 발생하는 것을 알아채면 정해진 일을 수행하구요. 다음은 Tkinter에서의 가장 기본적인 마우스 이벤트 처리 예제랍니다.
# mouse1.py from Tkinter import * root = Tk() def callback(event): print "clicked at", event.x, event.y frame = Frame(root, width=100, height=100) frame.bind("<Button-1>", callback) frame.pack() root.mainloop()
이걸 실행해보면 창이 하나 뜨구요, 그 창에다가 마우스 버튼을 클릭할 때마다 그 점 위치가 숫자로 표시되지요.
그 위치를 숫자로 나타내주는 일을 callback() 함수가 하구요, frame의 bind() 메소드는 왼쪽버튼(Button-1)이 눌려지면 callback 함수를 호출하라는 것을 알려주고 있네요.
mouse1.py 실행 모습
자, 이걸 약간 응용해서 캔버스에다 점을 찍는 프로그램을 만들어볼까요.
# mouse2.py from Tkinter import * root = Tk() canvas = Canvas(root, width=300, height=300) def callback(event): canvas.create_oval(event.x, event.y, event.x+1, event.y+1) canvas.bind("<Button-1>", callback) canvas.bind("<B1-Motion>", callback) canvas.pack() root.mainloop()
이번에는 Tkinter의 root에 프레임 대신 캔버스를 얹었구요, bind() 메소드는 마우스 왼쪽버튼을 누르거나(Button-1), 누른채로 이동하는(B1-Motion) 이벤트를 감지해서 callback 함수를 호출하도록 해줬습니다.
callback() 함수에서는 캔버스에 아주 작은 원을 그려서 점으로 표현되도록 했구요.
mouse2.py 실행 모습
이렇게 해서 점을 찍는 것까지는 해보았는데, 그림판 같은 프로그램에서 선을 그리는 기능하고는 차이가 있네요.
그림판에서는 마우스 버튼을 누르고 이동하면 이어진 선이 그려지는데 비해 위의 예제는 띄엄띄엄 점이 찍히니까요.
어떻게하면 그림판처럼 선이 그려지도록 할 수 있을까요?
답은 간단합니다. 점과 점을 이어서 선을 그려주는 거예요.--;
# mouse3.py from Tkinter import * root = Tk() canvas = Canvas(root, width=300, height=300) def draw(event): global x0, y0 canvas.create_line(x0, y0, event.x, event.y) x0, y0 = event.x, event.y def down(event): global x0, y0 x0, y0 = event.x, event.y def up(event): global x0, y0 if (x0, y0) == (event.x, event.y): canvas.create_line(x0, y0, x0+1, y0+1) canvas.bind("<B1-Motion>", draw) canvas.bind("<Button-1>", down) canvas.bind("<ButtonRelease-1>", up) canvas.pack() root.mainloop()
예제의 draw() 함수를 보시면 x0, y0가 방금 지나쳤던 점의 위치를 기억하고 있다가, 새로운 점이 선택되면 두 점을 이어서 선을 그려준다는 걸 알 수 있을 거예요.
그리고 선을 그리다가 마우스 버튼을 놓고 다시 클릭하는 경우에는 점의 위치를 새로 잡아줘야하기 때문에 down() 함수를 만들어줬지요.
또, 제자리에서 클릭했다가 바로 손을 떼는 경우(이 때 ButtonRelease-1 이벤트가 발생함)에는 점을 찍어주려고 up() 함수도 만들어줬구요.
이 예제가 실행된 모습은 아래와 같습니다.
mouse3.py 실행 모습
이렇게 해서 마우스에 관련된 이벤트 세 가지를 다뤄보았는데요, 그밖에도 <Double-Button-1>(마우스 왼쪽 버튼을 더블 클릭)라든지 <Shift-Button-1>(Shift 키를 누른 상태에서 마우스 왼쪽 버튼 클릭)와 같이 여러 가지 이벤트를 지정할 수 있답니다.
오랜만에 예제를 만들고 강좌를 써보니까 참 재미있네요. 간단한 거지만 여러분에게 조금이나마 도움이 되었으면 좋겠습니다.
다음 강좌는 또 언제 쓰게 될 지 모르겠네요. 그 때까지 모두들 안녕~
출처 : wikidocs 왕초보를 위한 파이썬'Python > 왕초보를 위한 파이썬' 카테고리의 다른 글
10.1. DIR 흉내내기 (0) | 2012.04.12 |
---|---|
10. 시스템 (0) | 2012.04.12 |
09. GUI (0) | 2012.04.12 |
08. 예외처리 (0) | 2012.04.12 |
7.5. 특별한 메서드들 (0) | 2012.04.12 |
댓글