본문 바로가기

공부/python

(python) tkinter을 통한 GUI 프로그래밍5 - 애니메이션, 라디오 버튼, 체크박스, 리스트 박스 위젯

*리스트 박스 위젯은 학교에서 배우지 않고 넘어갔음.

 

파이썬을 이용하여 애니메이션을 작성하려면 일정 시간을 간격으로

달라지는 그림을 화면에 표시하면 된다. 흔히 볼 수 있는 애니메이션과

방식은 똑같다.

 

오른쪽으로 움직이는 공 애니메이션

  • 애니메이션이 너무 빨리 그려지면 안 되기 때문에 time 모듈을 포함시킨다.
  • 그리기 객체의 아이디를 알고 있어야 하므로, create_oval() 함수의 반환값을
    변수 id에 저장하여 객체의 아이디를 반환한다.
  • canvas.move() 함수를 사용한다. 첫 번째 매개 변수는 움직이고자 하는 객체의
    아이디(id)이다. 두 번째와 세 번째 매개 변수는 x방향과 y방향의 이동거리이다.
  • window.update()는 화면을 다시 그린다. 만약, update()를 호출하지 않으면 화면을
    변경하지 않으면서 원의 좌표만 변경되기에 마지막 원의 위치만 볼 것이다.
  • 반복 루프 for i in range(100)을 사용하여 원을 움직이고 윈도우를 다시 그린 뒤,
    time.sleep()을 호출하여서 실행을 잠시 지연시킨다.

 

화살표 키로 움직이는 공 애니메이션

키보드에 반응하는 애니메이션을 만들어보자.

키를 누르거나 마우스가 움직이는 것을 이벤트(event)가 발생했다고 한다.

 

이벤트를 처리하는 가장 일반적인 방법은 이벤트에 함수를 연결하는 것이다.

이벤트가 발생하게되면 함수가 자동으로 호출된다.

 

tkinter에는 이벤트를 처리하는 기능이 있다. 아래의 예를 보자.

함수는 매개 변수 event를 받는다. 이 매개 변수에는 발생한 이벤트에 대한 정보가

들어 있다. 이벤트가 발생했을 때 이 함수가 호출되도록 하려면 bind_all() 함수를

사용한다.

 

bind_all() 함수의 첫 번째 매개 변수에는 tkinter가 처리해야하는 이벤트를 지정한다.

위에는 <KeyPress-Right>가 지정되어 있는데, 이것은 오른쪽 화살표가 눌리는 이벤트를

나타낸다. 이 이벤트가 발생하면 tkinter는 move_right() 함수를 호출한다.

 

더 응용해서 화살표 키를 전부 사용해보자.

간단하다.

 

이벤트에 관한 더 자세한 정보는 아래의 링크에서 확인할 수 있다.

http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

 

라디오 버튼

라디오 버튼(radio button)은 체크 박스와 비슷하지만 하나의 그룹 안에서는 한 개의 버튼만

선택할 수 있다는 점이 다르다.

 

아래의 예를 보자.

  • choice = IntVar() : 정수형 변수 choice 생성
  • ~.pack(anchor=w) : 왼쪽으로 정렬

위처럼 많은 버튼을 생성하려면 매우 귀찮아질 것이다.

값을 저장하는 리스트를 생성하고 반복 루프를 이용하여 필요한 라디오 버튼을

생성해보자.

반복문에서 리스트에 저장된 텍스트와 값을 가져와서 라디오 버튼을 생성한다.

 

체크박스

체크 박스(check box)는 사용자가 선택 항목 중에서 여러개를 동시에 선택할 수 있도록

허용하는 위젯이다. Yes와 No 중에서 하나를 선택하게 하는데 주로 사용된다.

 

아래의 예를 보자.

  • ~.grid(row=1,~ : 격차 배치 관리자의 1번째 행에 배치된다.
  • ~, sticky=W) : 이 옵션이 없으면 셀 안에서 위젯이 중앙정렬된다.
    W는 왼쪽 정렬이다.

 

리스트 박스 위젯

리스트 박스 위젯(list box widget)은 사용자가 선택할 수 있는 항목들을 메뉴로 보여준다.

윈도우를 생성한 후에 Listbox() 생성자를 호출하여 생성한다.

'height' 매개 변수가 얼마나 많은 라인을 표시할 것인지 지정한다.

 

아래의 예를 보자.

처음보는게 많다. 차근차근 살펴보겠다.

  • sb = Scrollbar(window, orient=VERTICAL)
    sb.pack(side=RIGHT, fill=Y) 는 스크롤바를 생성하는 코드이다.
    스크롤바는 없어도 무방하지만, 보기 좋게하기위해 넣었다.
  • insert() 함수의 END는 리스트 박스의 끝에 항목을 추가하라는 의미이다.
  • sb.configure(command=lb.yview)
    lb.configure(yscrollcommand=sb.set) 는 스크롤바와 리스트 박스를 연결시켜 주는
    코드이다. 없으면 스크롤바만 생기고, 두 위젯이 서로 상호작용하지 않는다.