ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [1월 4주차-1/24(2)]Python GUI 프로그래밍: Tkinter로 시작하기
    Why Not SW CAMP 5기/수업 기록 2025. 1. 24. 15:27

     

    Python에서 GUI(Graphical User Interface)를 구현하려면 Tkinter를 가장 많이 사용합니다. Tkinter는 기본으로 제공되는 모듈로, 그래픽 요소를 쉽게 추가할 수 있어 초보자부터 전문가까지 유용하게 활용할 수 있습니다. 이번 글에서는 Tkinter의 기본 개념부터 다양한 위젯 사용 방법까지 알아보겠습니다.


    1. GUI와 Tkinter란?

    • UI(User Interface): 사용자와 프로그램 간의 상호작용을 가능하게 하는 모든 요소를 의미합니다.
    • GUI(Graphical User Interface): UI 중에서 시각적인 요소를 활용하여 사용자 경험을 향상시키는 인터페이스를 의미합니다.
    • Tkinter: Python에서 기본으로 제공하는 GUI 라이브러리로, 버튼, 텍스트, 이미지 등 다양한 위젯을 생성하고 배치할 수 있습니다.

    2. Tkinter 창 생성하기

    Tkinter에서 가장 기본적인 작업은 창을 띄우는 것입니다.

    from tkinter import *
    
    # 기본 창 생성
    root = Tk()
    
    # 창의 제목 설정
    root.title('My First Tkinter')
    
    # 창 크기 지정
    root.geometry('400x200')
    
    # 창 실행
    root.mainloop()
    

    위 코드로 기본 창을 생성하고 실행할 수 있습니다. root.mainloop()는 창이 닫힐 때까지 프로그램이 실행되도록 유지하는 역할을 합니다.


    3. 레이블 (Label)

    레이블은 텍스트나 이미지를 표시하는 위젯입니다.

    레이블 옵션들

    3-1. 텍스트 레이블

    root = Tk()
    root.title('Label Example')
    root.geometry('400x200')
    
    label1 = Label(root, text='Hello, Tkinter!', bg='red', fg='yellow',
                  font=('Malgun Gothic', 20), width=15, height=3,
                  anchor='center', relief='raised', borderwidth=10)
    label1.pack()
    
    root.mainloop()
    

    위 코드는 빨간 배경과 노란 텍스트 색상을 가진 레이블을 생성합니다.

    3-2. 이미지 레이블

    이미지도 레이블로 표시할 수 있습니다.

    root = Tk()
    root.title('Image Label')
    root.geometry('600x500')
    
    image = PhotoImage(file='map_y.png')  # 이미지 파일 경로
    img_label = Label(root, image=image)
    img_label.pack()
    
    root.mainloop()
    

    3-3. 텍스트와 이미지 배치

    레이블을 그리드 레이아웃으로 배치해 텍스트와 이미지를 함께 표시할 수 있습니다.

    root = Tk()
    root.title('Text and Image')
    root.geometry('700x500')
    
    label_txt = Label(root, text='Hello Tkinter', font=('Malgun Gothic', 30))
    label_txt.grid(row=0, column=0)
    
    image = PhotoImage(file='map_y.png')
    label_img = Label(root, image=image)
    label_img.grid(row=1, column=0)
    
    root.mainloop()
    

    4. 버튼 (Button)

    버튼을 클릭하면 특정 동작을 수행하도록 이벤트를 연결할 수 있습니다.

    Hello 출력 버튼

    결과

    from tkinter import *
    
    def sayhello():
        txt.set('Hello!!!' * 3)
    
    root = Tk()
    root.title('Button Example')
    root.geometry('400x200')
    
    btn1 = Button(root, text='Click!', width=10, height=2, command=sayhello)
    label = Label(root, text='Click the button~!')
    
    txt = StringVar()
    message = Label(root, textvariable=txt)
    
    btn1.grid(row=0, column=1)
    label.grid(row=0, column=0)
    message.grid(row=1, column=0, columnspan=2)
    
    root.mainloop()
    

    StringVar()는 동적으로 변하는 텍스트를 저장하는 변수입니다.


    5. 구구단 프로그램 만들기

    랜덤 구구단 문제를 생성하고 정답을 표시하는 간단한 프로그램입니다.

    결과

    from tkinter import *
    import random
    
    num1, num2 = 0, 0
    
    # 버튼 클릭시 실행될 이벤트 작성
    def make_question():
        global num1, num2
        num1, num2 = random.randint(1,9), random.randint(1,9)
        question.set(str(num1)+' x '+str(num2)+' = '+'?')
        answer.set('')
    
    def check_answer():
        answer.set(num1*num2)
    
    # tkinter 화면 구성
    root = Tk()
    
    root.title('구구단을 외자')
    root.geometry('500x400')
    
    label1 = Label(root, text='루비랑~ 함께하는~ 랜덤~ 구구단~',
                   font=('Malgun Gothic', 15))
    label1.grid(row=0, column=0, columnspan=2)
    
    # 문제 부분
    question = StringVar()
    q_lbl = Label(root, width=25, textvariable = question,
                 bg='lightblue', font=('Malgun Gothic', 18))
    q_lbl.grid(row=1, column=0)
    
    q_btn = Button(root, text='새로운 문제', width=10,
                   command=make_question, font=('Malgun Gothic', 15))
    q_btn.grid(row=1, column=1)
    
    # 정답 부분
    answer = StringVar()
    a_lbl = Label(root, width=25, textvariable = answer,
                 bg='pink', font=('Malgun Gothic', 18))
    a_lbl.grid(row=2, column=0)
    
    a_btn = Button(root, text='정답', width=10,
                   command=check_answer, font=('Malgun Gothic', 15))
    a_btn.grid(row=2, column=1)
    
    root.mainloop()
    

    6. 엔트리 (Entry)

    엔트리는 텍스트를 입력받는 필드를 제공합니다.

    from tkinter import *
    
    def entry_value():
        print(ent.get())
    
    root = Tk()
    root.title('Entry Example')
    root.geometry('500x400')
    
    ent = Entry(root, width=25)
    ent.grid(row=0, column=1)
    
    label = Label(root, text='Name: ', width=10, height=5)
    label.grid(row=0, column=0)
    
    btn = Button(root, text='OK', command=entry_value)
    btn.grid(row=0, column=2)
    
    root.mainloop()
    

    7. 프레임 (Frame)

    프레임은 위젯을 그룹으로 묶는 컨테이너 역할을 합니다.

    결과

    from tkinter import *
    
    root = Tk()
    root.title('Frame Example')
    root.geometry('400x200')
    
    frame_A = Frame(root, relief='groove', borderwidth=2)
    frame_A.grid(row=0, column=0)
    
    frame_B = Frame(root, relief='groove', borderwidth=2)
    frame_B.grid(row=1, column=0)
    
    id_label = Label(frame_A, text='ID', width=10, height=2)
    id_label.grid(row=0, column=0)
    
    ent1 = Entry(frame_A, width=25)
    ent1.grid(row=0, column=1)
    
    pw_label = Label(frame_B, text='PW', width=10, height=2)
    pw_label.grid(row=0, column=0)
    
    ent2 = Entry(frame_B, width=25)
    ent2.grid(row=0, column=1)
    
    btn = Button(root, text='Login', width=10)
    btn.grid(row=2, column=0, columnspan=2)
    
    root.mainloop()
    

    정리하며

    Tkinter는 Python을 사용해 간단한 GUI를 구현하는 데 적합한 라이브러리입니다. 이번 글에서 다룬 텍스트 레이블, 버튼, 엔트리, 프레임 등은 기본적인 위젯들이지만, 이를 조합하여 GUI 애플리케이션을 만들 수 있엇습니다.😊

Designed by Tistory.