Language/Python

[파이썬] tkinter (1)

nowkoes 2024. 6. 24. 22:47

tkinter

개요

출처: https://docs.python.org/3/library/tkinter.html

 

 파이썬에는 다양한 GUI(Graphical User Interface) 라이브러리가 존재한다. 그중, Python 표준 라이브러리인 tkinter는 Python과 함께 배포되므로 별도의 설치가 필요하지 않다. 이번 시간에는 해당 라이브러리를 통해 간단하게 GUI를 생성하는 방법에 대해 알아보도록 하겠다.

  • GUI: 사용자가 컴퓨터와 상호작용할 수 있는 시각적 인터페이스. 텍스트 기반 인터페이스와 달리 아이콘, 버튼, 윈도우, 라벨 등 시각적 요소를 사용하여 직관적이고 사용하기 쉽게 만들 수 있다

본문

위젯 - 윈도우(Window)

출처: https://docs.python.org/3/library/tkinter.html#the-window-manager

 

  윈도우기본적인 애플리케이션 창을 의미한다. Tkinter에서 하나의 기본 창을 생성하고 실행하는 방법을 예제로 설명해 보겠다.

 

import tkinter as tk

root = tk.Tk()
root.mainloop()

실행 화면

 

 

  일반적으로 tkinter 모듈은 tk로 줄여 쓰며, 가장 상위 레벨의 창을 root라고 부른다. 위 코드를 보면, root 창을 생성하고 root 창을 mainloop라는 함수로 실행시키고 있다는 것을 파악할 수 있다. 즉, 하나의 창 내에 어떤 위젯을 덧붙이고 싶다면 메인 윈도우를 선언한 부분과 mainloop 사이를 채우면 된다. 예를 들어, 창의 배경과 크기, 그리고 제목을 짓고 싶으면 다음과 같이 코드를 작성하면 된다.

 

import tkinter as tk

root = tk.Tk()

root.title("example for tkinter")
root.geometry("500x300")
root.configure(bg='gray20')

root.mainloop()

실행 화면


위젯 - 라벨(label)

출처: https://www.geeksforgeeks.org/python-tkinter-label/

 

 라벨텍스트나 이미지를 표시하는 데 사용되는 위젯이다. 일반적으로 윈도우나, 후술할 프레임(frame)에 종속되어 사용할 수 있다. 이때 해당 라벨을 배치하는 방법은 크게 3가지가 존재하는데, 세 가지를 각각 비교하도록 하겠다.

 

import tkinter as tk

root = tk.Tk()

root.title("example for tkinter")
root.geometry("500x300")
root.configure(bg='gray20')

label1 = tk.Label(root, text="label1", anchor='c')
label1.grid(row=0, column=0, padx=5, pady=5)

label2 = tk.Label(root, text="label3", anchor='w')
label2.place(x=300, y=200)

root.mainloop()

 

 라벨의 인자로는 해당 라벨의 상위 노드, 텍스트, 위치 등이 존재한다. 일반적으로 anchor는 우측의 사진처럼 위치가 지정되어 있다. 그리고 해당 라벨을 grid로 배치하면, 위젯을 행과 열로 구성된 격자에 배치한다고 생각하면 된다. 반면 place 같은 경우엔 위젯을 절대 좌표로 배치하는 방식으로, 위젯을 정확한 위치에 배치할 수 있지만 레이아웃이 반응형이지 않기 때문에 창 크기 변경 시 문제가 발생할 수 있다.

  • 이는 창의 크기가 변하는 것을 이벤트로 지정하여 변하는 비율만큼 크기를 줄이면 해결할 수 있지만, window api를 호출하는 등 복잡한 과정을 거쳐야 한다.

 

import tkinter as tk

root = tk.Tk()

root.title("example for tkinter")
root.geometry("500x300")
root.configure(bg='gray20')

label3 = tk.Label(root, text="label2", anchor='n')
label3.pack(side="top", fill="x")

 

 그리고 pack 같은 경우엔 위젯을 상자 안에 배치하는 방식이다. 상자 안에서 상하좌우로 정렬되는 특성을 갖고 있어 간단한 배치를 할 때 편하지만, 복잡한 레이아웃을 만들기 어려워 제어가 제한적이다.


예시 - 격자무늬 패턴 만들기

  지금까지 배운 window와 label을 이용하여 격자무늬 패턴을 만들어 보자.

 

import tkinter as tk

def create_grid(window, rows, cols):
    for row in range(rows):
        for col in range(cols):
            label = tk.Label(window, text="", bg="black" if (row+col) % 2 == 0 else "white", width=4, height=2)
            label.grid(row=row, column=col)

root = tk.Tk()
root.title("Grid Pattern Example")

create_grid(root, 8, 8)

root.mainloop()

 

 다음과 같이 label을 생성하는 부분을 함수로 모듈화하여 배경과 크기, 높이, 위치를 지정해주었다. 그리고 원하는 크기로 지정한 후 함수를 호출하면 다음과 같은 격자무늬를 만들 수 있다.

반응형

'Language > Python' 카테고리의 다른 글

[파이썬] 반응형 GUI  (0) 2024.09.23
[파이썬] tkinter (2) - PDF 페이지 추출 프로그램  (0) 2024.06.29
[Python] PDF 텍스트 추출  (0) 2023.10.31
[Python] matplotlib(1)  (0) 2023.09.12
[Python] 클립 보드 with Python  (0) 2023.07.29