Python

[Python] Tkinter를 이용한 GUI 프로그래밍

디지몬진화 2024. 6. 16. 15:19

1. Tkinter 알아보기

- 파이썬에서 GUI(Graphical User Interface) 애플리케이션을 개발하기 위한 표준 라이브러리

- Tk GUI 툴킷의 파이썬 인터페이스이며, 여러 가지 위젯과 도구를 사용하여 사용자 인터페이스를 만들 수 있음

- 파이썬 표준 라이브러리에 이미 포함 (별도의 설치 필요 X)

 

 

2. 위젯이란?

- 윈도우와 같은 GUI 기반 운영체제에서 많이 사용하는 각종 시각적인 요소

 

 

3. tkinter 예제

from tkinter import * #tkinter 라이브러리에서 모든 클래스, 함수, 변수들을 포함

root = Tk() # 윈도우 생성
root.geometry("300x200") # 창의 크기 설정

label = Label(root, text="Hello, World!") # 레이블 위젯 생성
label.pack() # 레이블 배치

root.mainloop() # 이벤트 루프 시작

 

3-1 예제 설명

- from tkinter import * : tkinter 라이브러리에서 모든 클래스, 함수, 변수들을 포함시킨다. 이렇게 하면 tkinter의 클래스, 함수 및 상수를 직접 사용할 수 있다.

- root = Tk() : 제일 먼저 루트 윈도우를 생성하여야 한다. tkinter 모듈 안에 있는 Tk 클래스는 제목을 가지고 있는 일반적인 윈도우이다. Tk 클래스의 객체를 생성하면 화면에 하나의 윈도우가 생성된다.

- root.geometry("300x200") : 이 문장은 윈도우의 크기를 300×200으로 설정한다.

 

- label = Label(root, text="Hello, world!") : 레이블(Label) 클래스를 사용하여 텍스트 레이블 위젯을 생성한다.


- label.pack() : 위젯에 대하여 pack() 메소드가 호출된다. pack()은 텍스트를 표시할 정
도로만 위젯의 크기를 축소하라는 의미이다. pack()이 호출되어야 위젯이
화면에 나타난다.

- root.mainloop() : 이벤트 루프는 사용자로부터 오는 마우스나 키보드 이벤트 뿐만 아니라 윈도우 시스템에서 오는 여러 가지 이벤트도 함께 처리한다


4. 컨테이너 위젯과 단순 위젯

- 단순 위젯 : 단순한 위젯으로 Button, Canvas, Checkbutton, Entry, Label, Message 등이 여기에 속함

- 컨테이너 : 다른 컴포넌트를 안에 포함할 수 있는 컴포넌트로서 Frame, Toplevel, LabelFrame, Panedroot 등이 여기에 속함

 

5. 레이블

- 레이블 위젯 : 텍스트나 이미지를 표시하는데 사용

                       Tkinter 라이브러리에서 제공하는 Label 클래스를 사용하여 생성

from tkinter import *

root = Tk()

Label(root,
    text="Times Font 폰트와 빨강색을 사용한다. ",
    fg = "red",
    font = "Times 32 bold italic").pack()
Label(root,
    text="Helvetica 폰트와 녹색을 사용한다. ",
    fg = "blue",
    bg = "yellow",
    font = "Helvetica 32 bold italic").pack()
root.mainloop()

 

5-1 이미지 표시 레이블

- PhotoImage 클래스를 이용해 이미지 읽기

- 레이블 생성 시 매개변수 image를 통하여 전달

from tkinter import *

root = Tk()
photo = PhotoImage(file="dog2.gif")
label = Label(root, image=photo)
label.pack()
root.mainloop()

 

따옴표 3개(""")를 치면 엔터한 텍스트도 엔터 포함해서 출력

 

 

6. 버튼

- 사용자와 상호작용을 할 목적으로 설계된 위젯

- 클릭할 때마다 함수를 호출하도록 구성 가능

from tkinter import *

def button_clicked():
print("버튼이 클릭되었습니다!")

root = Tk()   # 부모 위젯 생성
root.geometry("300x200")

button = Button(root, text="클릭하세요", command=button_clicked) # 버튼 위젯 생성
button.pack()    # 버튼 위젯 배치

root.mainloop()   # 이벤트 루프 시작

 

 

7. 엔트리

- 사용자로부터 한 줄의 텍스트를 가져와야 하는 경우 사용

from tkinter import *

def get_entry_value():
    value = entry.get()
    print("입력된 값:", value)

root = Tk() # 부모 위젯 생성
root.geometry("300x200")

entry = Entry(root) # 엔트리 위젯 생성
entry.pack() # 엔트리 위젯 배치

button = Button(root, text="확인", command=get_entry_value) # 버튼 위젯 생성
button.pack() # 버튼 위젯 배치

root.mainloop() # 이벤트 루프 시작

 

 

8. 텍스트위젯

- 멀티 라인 텍스트 입력을 위한 위젯

- 텍스트 표시, 편집 기능 제공

from tkinter import *

def display_text():
    text = text_widget.get("1.0", END) #"1.0"은 첫 번째 줄(1)의 첫 번째 문자열 위치(0)를, END는 텍스트의 끝 위치를 나타낸다
    print("입력된 정보:")                #따라서 ("1.0", END)는 모든 텍스트를 호출한다
    print(text)

root = Tk()

# 텍스트 위젯
text_widget = Text(root, width=60, height=10)
text_widget.pack()

# 출력 버튼
button = Button(root, text="출력", command=display_text)
button.pack()

root.mainloop()

 

 

9. 라디오 버튼

- 그룹 안에서 한개의 버튼만 선택 가능

from tkinter import *

root = Tk()
choice = IntVar()

Label(root,
    text="가장 선호하는 프로그래밍 언어를 선택하시오",
    justify = LEFT,
    padx = 20).pack()

Radiobutton(root, text="Python", padx = 20, variable=choice,
value=1).pack(anchor=W)
Radiobutton(root, text="C", padx = 20, variable=choice,
value=2).pack(anchor=W)
Radiobutton(root, text="Java", padx = 20, variable=choice,
value=3).pack(anchor=W)
Radiobutton(root, text="Swift", padx = 20, variable=choice,
value=4).pack(anchor=W)

root.mainloop()

 

 

 

10. 체크박스

- 사용자가 클릭하여서 체크된 상태와 체크되지 않은 상태 중의 하나로 만들 수 있는 위젯 (그룹 안에서 여러개 선택 가능)

from tkinter import *

root = Tk()
Label(root, text="선호하는 언어를 모두 선택하시오:").grid(row=0, sticky=W)

value1 = IntVar()   #IntVar는 정수값을 저장하는데 사용됨
Checkbutton(root, text="Python", variable=value1).grid(row=1, sticky=W)
value2 = IntVar()
Checkbutton(root, text="C", variable=value2).grid(row=2, sticky=W)
value3 = IntVar()
Checkbutton(root, text="Java", variable=value3).grid(row=3, sticky=W)
value4 = IntVar()
Checkbutton(root, text="Swift", variable=value4).grid(row=4, sticky=W)

root.mainloop()

 

 

 

11. 리스트박스 위젯

- 사용자가 선택할 수 있는 항목들을 메뉴로 보여줌

from tkinter import *

root = Tk()

lb = Listbox(root, height=4)
lb.pack()
lb.insert(END,"Python")
lb.insert(END,"C")
lb.insert(END,"Java")
lb.insert(END,"Swift")

root.mainloop()

 

 

12. 프레임 위젯

- 다른 위젯을 담을 수 있는 컨테이너 역할

from tkinter import *

root = Tk()   # 부모 위젯 생성
root.geometry("300x200")

frame = Frame(root, width=200, height=100) # Frame 위젯 생성
frame.pack()   # Frame 위젯 배치

button1 = Button(frame, text="버튼 1") # 버튼 1
button1.pack(side="left")

button2 = Button(frame, text="버튼 2") # 버튼 2
button2.pack(side="left")

root.mainloop() # 이벤트 루프 시작

 

 

13. 배치관리자

 

13-1 Pack 배치 관리자

- pack() : 위젯을 배치

- (side = " ") : 위젯의 배치 방향 지정

rom tkinter import *

root = Tk()
root.geometry("300x100")

button1 = Button(root, text="버튼 1", bg="red", fg="white")
button2 = Button(root, text="버튼 2", bg="green", fg="black")
button3 = Button(root, text="버튼 3", bg="blue", fg="white")

button1.pack()
button2.pack()
button3.pack()

root.mainloop()

button1.pack(side=LEFT, padx=10)  #padx는 왼쪽 및 오른쪽에 픽셀을 추가함
button2.pack(side=LEFT, padx=10)
button3.pack(side=LEFT, padx=10)

 

 

13-2 Grid 배치 관리자

- grid() :위젯을 표 그리드 형식으로 배치

- 행(row) 및 열(column)을 사용하여 위젯의 위치를 지정

from tkinter import *

root = Tk()
root.geometry("300x100")

button1 = Button(root, text="버튼 1", bg="red", fg="white")
button1.grid(row=0, column=0)

button2 = Button(root, text="버튼 2", bg="green", fg="black")
button2.grid(row=0, column=1)

button3 = Button(root, text="버튼 3", bg="blue", fg="white")
button3.grid(row=1, column=0)

button4 = Button(root, text="버튼 4", bg="yellow", fg="red")
button4.grid(row=1, column=1)

root.mainloop()

 

 

13-3 Place 배치 관리자

- place() : 위젯을 직접적으로 위치

- 위젯의 절대 좌표(x, y)를 사용하여 위치 지정

from tkinter import *

root = Tk()
root.geometry("300x100")

button1 = Button(root, text="버튼 1", bg="red", fg="white")
button1.place(x=0, y=0)

button2 = Button(root, text="버튼 2", bg="green", fg="black")
button2.place(x=30, y=30)

button3 = Button(root, text="버튼 3", bg="blue", fg="white")
button3.place(x=60, y=60)

root.mainloop()

 

 

14. 이벤트 처리

- 콜백함수 : 이벤트가 발생하였을 때 호출되는 함수

 

14-1 버튼 클릭 이벤트

- 마우스로 버튼을 클릭했을 때 발생하는 이벤트

from tkinter import *

def callback():
    """
    콜백 함수: 버튼이 클릭되면 호출되어 버튼의 텍스트를 변경한다.
    """
    button["text"] = "버튼이 클릭되었음!"

# Tkinter 윈도우 생성
root = Tk()

# 버튼 생성 및 콜백 함수와 연결
button = Button(root, text="클릭", command=callback)
button.pack(side=LEFT) # 버튼을 윈도우에 팩 배치

root.mainloop() # Tkinter 이벤트 루프 실행

 

14-2 마우스 이벤트

- 마우스 동작에 대한 이벤트로, 클릭, 이동, 드래그 등을 다룸

from tkinter import *

def left_click(event):
    print(f"좌측 버튼이 ({event.x},{event.x})에서 클릭되었습니다.")

def right_click(event):
    print(f"우측 버튼이 ({event.x},{event.x})에서 클릭되었습니다.")

root = Tk()

frame = Frame(root, width=200, height=200)
frame.bind("<Button-1>", left_click)
frame.bind("<Button-3>", right_click)
frame.pack()

root.mainloop()

 

14-3 키보드 이벤트

- 키보드로 키를 입력했을 때 발생하는 이벤트

from tkinter import *

def key_press(event):
    print("키가 눌렸습니다:", event.keysym)

root = Tk()
root.geometry("200x200")

root.bind("<Key>", key_press)
root.focus_set()

root.mainloop()

 

 

 

 

15. 색상

배경(bg)와 전경(fg) 변수를 사용하여 위젯 및 텍스트 색상 지정 가능

button["fg"] = "yellow"

 

15-1 askcolor()

- tkinter.colorchooser 모듈의 askcolor()를 호출하면 대화상자를 통하여 색상의 값을 입력받을 수 있음

import tkinter as tk
from tkinter import colorchooser
color = colorchooser.askcolor(title="색상 선택")
print(color)

 

 

16. 폰트

- 튜플로 지정 가능 --> (폰트 이름, 폰트 크기, 폰트 스타일)

("Times", 10, "bold")
("Helvetica", 10, "bold italic")
("Symbol", 8)
w = Label(master, text="Helvetica", font=("Helvetica", 16))

 

 

17. 캔버스 위젯

- 도형, 텍스트, 이미지 등 다양한 그래픽 요소를 그리는 함수

from tkinter import *

#Tkinter 윈도우 생성
root = Tk()

#Canvas생성 및 크기 설정
w = Canvas(root, width=300, height=200)
w.pack()

#Tkinter 이벤트 루프 실행
root.mainloop()