[python] GUI programming tkInter (소개 및 생성)
A A

목차

    728x90

    TkInter

    각 운영체제는 고유 GUI에서 작동하도록 설계된 자체 서비스 세트를 제공한다.

    특히 리눅스와 같은 일부 운영체제는 비주얼 프로그램잉을 위한 두개 이상의 표준을 정의하기도 한다.

    (U*x 환경에서 가장 널리 사용되는 표준은 GTK,Qt)

     

    즉, 이식성 있는 GUI 어플리케이션(서로 다른 운영체제에서 동일하게 작동하는 앱)을 구축하려면 더 많은 것이 필요하다.

    바로 어뎁터(Adapter)이다. 통일된 기능 세트를 통해 프로그래머는 운영체제를 걱정할 필요없이 하나의 코드를 작성할 수 있다.

    이러한 어뎁터를 위젯 툴 킷(widget toolkit), GUI 툴 킷(GUI toolkit) 또는 UX 라이브러리(UX library)라 한다.

     

    이런 툴킷 중 우리에게 매우 매력적인 것은 Tk 이다.

    Tk는 무료이고 개방적이며, 1991년 이후로 개발되어 안정적이다.

    30개 이상의 다양한 범용 위젯을 정의하고 제공함으로, 복잡한 어플리케이션에서도 충분하다.

    해당 구현은 파이썬 뿐만 아니라 많은 프로그래밍 언어에서도 가능하다.

     

    이런 Tk를 파이썬 세계로 가져온 모듈의 이름이 TkInter이며, Tk Interface의 줄임말이다.

    최초의 파이썬 IDE인 IDLE 또한 TkInter를 사용하여 작성되었다.


    TkInter

    파이썬 관점에서는 tkinter의 이름의 패키지이다.

    해당 패키지는 GUI 애플리케이션을 빌드하는 데 사용하는 다양한 함수, 상수, 클래스, 객체, 모듈이 포함되어 있다.

     

    GUI 애플리케이션에는 4가지 필수 요소로 구성된다.

    • import tkinter
    • 어플리케이션 메인 창을 만들기.
    • 필수 위젯을 창에 추가하기.
    • 이벤트 컨트롤러를 시작하기.

    단계별로 어떻게 동작하는지 알아보자.

    import tkinter

     가장 간단한 방법은 위와 같이 패키지 전체를 가져오는 방법이다.

    전체를 가져옴과 동시에 일부 통제하기 어렵다.

    패키지의 내장된 일부 모듈은 접근할 수 없고 별도로 가져와야 한다.

    tkinter 컴포넌트 이름을 정규화 하여 사용해야한다.

    콘텐츠를 사용할 때 마다 긴 패키지 이름을 사용하고 싶지 않다면, import 시에 별칭을 만든다.

    import tkinter as tk

    모든 소스를 세부적으로 제어하고 싶다면

    각각 기능을 별도로 가져와 프로세스를 세부적으로 사용한다.

    from tkinter import Button
    
    # from tkinter import *
    # 해당 * 의 사용을 지양하자...

     

    애플리케이션을 만들 준비가 되었다.

     

    import tkinter
    
    controller = thinter.Tk()

    이후 애플리케이션 기본창은 tkinter 의 Tk()라는 메서드에 의해 생성된다.

    가장 일반적으로 사용되는 형식에서는 인자가 따로 필요하지 않다.

    이 메세드에서 반환되는 객체는 완전하지만, 보이지 않는다.

    또한, 이벤트 컨트롤러가 시작될 때 까지 표시되지 않는다.

     

    import tkinter
    
    controller = thinter.Tk()
    controller.mainloop()

    컨트롤러를 시작하려면 mainloop()라는 메서드를 호출해야한다.

    컨트롤러의 메인 루프에 진입하면 코드 실행을 직접 제어할 수 없게 된다.

    이제 완전히 컨트롤러에게 맞겨지게 되고, 메인 루프를 종료하는 것은 애플리케이션을 종료하는 것과 같다.

    컨트롤러와 함께 제공되는 루프가 없으면 더이상 할 수 있는 일이 없기 때문이다.

     

    정리한다면 아래와 같다.

    # 1. import 실행
    import tkinter as tk
    
    # 2. 이벤트 컨트롤러 생성 : 객체가 생성되었으나 보이진 않음.
    controller = tk.Tk()
    
    # 3. 이벤트 컨트롤러 메인창 메서드 호출
    controller.mainloop()

     

    조그만한 창이 하나 뜨는 것을 볼 수 있는데,

    이 창을 닫음과 동시에 파이썬은 종료된다.

     

    • 제목 추가

    해당 창은 아무 정보도 제목도 아이콘도 없는 상태로 존재하는데.

    title() 메서드를 이용하여 제목을 변경할 수 있다.

    # 1. import 실행
    import tkinter as tk
    
    # 2. 이벤트 컨트롤러 생성 : 객체가 생성되었으나 보이진 않음.
    controller = tk.Tk()
    
    # 3. 제목 변경
    controller.title('The first sample')
    
    # 4. 이벤트 컨트롤러 메인창 메서드 호출
    controller.mainloop()

     

    • 버튼 추가

    버튼 객체를 해당 이벤트 컨트롤러 객체를 인자로 넣어 생성하고, 위치를 배치한다.
    버튼 객체 생성시 첫번째 인자는 필수 값이며, 이후 값은 선택사항이다.

    위젯을 창 어딘가에 배치하는 작업은 place()메서드를 활용하는데,

    두 좌표를 지정하는 방식으로 동작한다.

    여기서 중요한 세가지 사항이 있다.

    1. 좌표는 기본적으로 왼쪽 상단 모서리가 차지하는 픽셀을 참조한다.
    2. 위젯의 크기는 콘텐츠에 맞게 생성자에 의해 결정된다.
    3. 왼쪽 상단 모서리에서 얼마나 이동하는지에 대한 픽셀을 기입한다.
    # 1. import 실행
    import tkinter as tk
    
    # 2. 이벤트 컨트롤러 생성 : 객체가 생성되었으나 보이진 않음.
    controller = tk.Tk()
    
    # 3. 제목 변경
    controller.title('The first sample')
    
    # 4. 버튼 추가
    button = tk.Button(controller, text='버튼')
    
    # 5. 버튼 위치 설정 : 왼쪽 모서리 기준
    button.place(x=10, y=10)
    
    # 6. 이벤트 컨트롤러 메인창 메서드 호출
    controller.mainloop()

     

    현재는 '버튼' 이라는 버튼이 등장하지만, 해당 버튼은 아무런 동작을 수행하지 않는다.

    바로 이때 이벤트 핸들러를 불러올 시간이다.

     

    • 이벤트 핸들러

    이벤트 핸들러는 버튼에 대한 모든 클릭에 응답하는 역할을 지녔다.

    필요한 이벤트 핸들러는 간닪나 할당을 갖는데, 바로 애플리케이션의 "종료"이다.

    이는 destroy() 라고 불리는 메인 윈도우 메서드를 통해 수행된다.

    생성과 달리 소멸에는 인자가 필요하지 않는다.

     

    이벤트 핸들러는 함수이다.

    매개변수가 없는 함수여야하며, 이름은 무엇이든 상관잉 없다.

    컨트롤러에 의해 호출된다는 점만 기억하자.

    이벤트 컨트롤러를 혼란스럽게 할 수 있으므로, 자체 핸들러를 호출하지 않는다.

    따라서 가장 간단한 핸들러는 다음과 같다.

    def click():
    	controller.destroy()

    이렇게 외부에서 호출하도록 설계된 함수를 종종 콜백 함수라고 부른다.

    핸들러는 완성했고, 버튼 생성시에 인자를 통해 전달한다.

     

    해당 코드에서 알아야할 점이 두가지 있다.

    1. 생성자의 매개변수를 사용하여 위젯에 콜백을 바인딩 하는 것은 이벤트를 위한 유일한 방법은 아니다.
      (콜백은 실행중에 대체될 수 있다.)
    2. 동일한 콜백을 두 개 이상 위젯에 바인딩 할 수 있다.
    # 버튼 이벤트 핸들러 추가 
    # 1. import 실행
    import tkinter as tk
    
    # 컨트롤러에 의해 실행될 이벤트 핸들러 (콜백함수).
    def click():
    	controller.destroy()
    
    # 2. 이벤트 컨트롤러 생성 : 객체가 생성되었으나 보이진 않음.
    controller = tk.Tk()
    
    # 3. 제목 변경
    controller.title('The first sample')
    
    #4. 버튼 + 이벤트 핸들러 추가 *
    button = tk.Button(controller, text='버튼', command=click)
    
    #5. 버튼 위치 설정 : 왼쪽 모서리 기준
    button.place(x=10, y=10)
    
    # 4. 이벤트 컨트롤러 메인창 메서드 호출
    controller.mainloop()

     

     

    물론 사용자의 확인을  위한 창을 생성할 수있다.

    tkinter 모듈의 messagebox라는 모듈이고, 사용자의 답변을 받기 위한 대화 상자를 만들 수 있다.

    이 대화 상자는 모달 창의 예시로, 모달창은 애플리케이션의 모든 포커스를 차지하는 창이다.

    모달 창이 있는 동안 다른 모든 애플리케이션 위젯은 작동하지 않는다.

    • 사용자의 의견 묻기 (모달창)
    # 버튼 이벤트 핸들러 추가 
    # 1. import 실행 + messagebox 추가*
    import tkinter as tk
    from tkinter import messagebox as msg
    
    # 컨트롤러에 의해 실행될 이벤트 핸들러 (콜백함수). 모달창 추가 *
    def click():
      answer = msg.askquestion('확인', '종료하시겠습니까?')
      if answer == 'yes':
    	  controller.destroy()
    
    # 2. 이벤트 컨트롤러 생성 : 객체가 생성되었으나 보이진 않음.
    controller = tk.Tk()
    
    # 3. 제목 변경
    controller.title('The first sample')
    
    #4. 버튼 + 이벤트 핸들러 추가 
    button = tk.Button(controller, text='버튼', command=click)
    
    #5. 버튼 위치 설정 : 왼쪽 모서리 기준
    button.place(x=10, y=10)
    
    # 4. 이벤트 컨트롤러 메인창 메서드 호출
    controller.mainloop()

    messagebox의 askquestion()를 활용하여

    첫번째 인자는 대화 상자의 창 제목으로 사용되고, 두번째 인수는 창 내부의 내용으로 표시된다.

    yes 를 통해 확인 버튼의 여부를 확인할 수 있다.

     

    현재엔 간단한 화면이나, 이후에는 조금 더 재미있는 tkinter를 활용해보자.

    Copyright 2024. GRAVITY all rights reserved