본문 바로가기
Python for Beginners

12.2 Tkinter 위젯

by Andrew's Akashic Records 2023. 4. 4.
728x90

Tkinter 위젯은 사용자 인터페이스의 구성 요소입니다. Tkinter에서는 다양한 유형의 위젯을 제공하며, 이를 조합하여 복잡한 GUI 애플리케이션을 만들 수 있습니다. 주요 Tkinter 위젯과 간단한 예제를 살펴봅시다.

Label
Label 위젯은 텍스트 또는 이미지를 표시할 수 있는 레이블입니다.

import tkinter as tk

root = tk.Tk()

label = tk.Label(root, text="This is a Label")
label.pack()

root.mainloop()

 

Button
Button 위젯은 클릭 가능한 버튼입니다. 콜백 함수를 지정하여, 버튼이 클릭되었을 때 원하는 동작을 수행할 수 있습니다.

import tkinter as tk

def on_click():
    print("Button clicked!")

root = tk.Tk()

button = tk.Button(root, text="Click me!", command=on_click)
button.pack()

root.mainloop()

 

Entry
Entry 위젯은 한 줄의 텍스트 입력 필드입니다.

import tkinter as tk

def on_submit():
    print(entry.get())

root = tk.Tk()

entry = tk.Entry(root)
entry.pack()

button = tk.Button(root, text="Submit", command=on_submit)
button.pack()

root.mainloop()

 

Text
Text 위젯은 여러 줄의 텍스트 입력 및 표시를 지원하는 위젯입니다.

import tkinter as tk

root = tk.Tk()

text = tk.Text(root, wrap=tk.WORD)
text.pack()

root.mainloop()

 

Frame
Frame 위젯은 다른 위젯을 그룹화할 수 있는 컨테이너입니다.

import tkinter as tk

root = tk.Tk()

frame = tk.Frame(root)
frame.pack()

label1 = tk.Label(frame, text="Label 1")
label2 = tk.Label(frame, text="Label 2")
label1.pack()
label2.pack()

root.mainloop()

 

Canvas
Canvas 위젯은 도형, 텍스트, 이미지 등을 그릴 수 있는 드로잉 영역입니다.

import tkinter as tk

root = tk.Tk()

canvas = tk.Canvas(root, width=300, height=200)
canvas.pack()

canvas.create_rectangle(50, 50, 250, 150, fill="blue")
canvas.create_text(150, 100, text="Hello Canvas!", fill="white")

root.mainloop()


Menu
Menu 위젯은 드롭다운 메뉴와 메뉴바를 생성하는 위젯입니다.

import tkinter as tk

def on_new():
    print("New selected")

root = tk.Tk()

menu_bar = tk.Menu(root)

file_menu = tk.Menu(menu_bar, tearoff=0)
file_menu.add_command(label="New", command=on_new)
file_menu.add_command(label="Open")
file_menu.add_separator()
file_menu.add_command(label="Exit", command=root.quit)

menu_bar.add_cascade(label="File", menu=file_menu)

root.config(menu=menu_bar)

root.mainloop()


이 예제들은 각 위젯의 기본 사용법을 보여줍니다. 실제 애플리케이션에서는 이러한 위젯들을 조합하여 다양한 사용자 인터페이스를 구성할 수 있습니다. 또한, 위젯의 속성을 변경하거나 이벤트를 처리하는 방법을 사용하여 동적인 인터페이스를 구현할 수 있습니다.

여기에 다양한 위젯을 사용하는 간단한 예제를 들어보겠습니다.

import tkinter as tk

def on_submit():
    entered_text = text_entry.get()
    text_display.insert(tk.END, f"{entered_text}\n")
    text_entry.delete(0, tk.END)

root = tk.Tk()
root.title("Tkinter Widgets Example")

frame1 = tk.Frame(root)
frame1.pack(pady=10)

text_entry = tk.Entry(frame1)
text_entry.pack(side=tk.LEFT)

submit_button = tk.Button(frame1, text="Submit", command=on_submit)
submit_button.pack(side=tk.LEFT)

frame2 = tk.Frame(root)
frame2.pack(pady=10)

text_display = tk.Text(frame2, wrap=tk.WORD, height=10, width=40)
text_display.pack()

root.mainloop()

이 예제에서는 Entry, Button, Text 위젯을 조합하여 사용자가 입력한 텍스트를 Text 위젯에 추가하는 간단한 인터페이스를 구성했습니다. 또한, Frame 위젯을 사용하여 위젯들을 그룹화하고, 팩 기하 관리자를 사용하여 위젯의 배치를 조절했습니다.

Tkinter를 사용하여 더 복잡한 인터페이스를 구현하려면, 위젯의 속성, 이벤트 처리, 기하 관리자 등에 대해 더 자세히 알아보세요. 이를 통해 사용자의 요구에 맞는 다양한 인터페이스를 구축할 수 있습니다.

 

Tkinter를 사용하여 좀 더 복잡한 인터페이스를 구축하기 위해 다음의 개념들에 대해 알아볼 필요가 있습니다.

변수 클래스 (StringVar, IntVar, DoubleVar, BooleanVar)
Tkinter 변수 클래스는 위젯 간에 데이터를 공유하고 동기화하는 데 유용합니다. 예를 들어, Entry 위젯의 텍스트를 Label 위젯과 동기화하려면 StringVar를 사용할 수 있습니다.

import tkinter as tk

root = tk.Tk()

text_var = tk.StringVar()

entry = tk.Entry(root, textvariable=text_var)
entry.pack()

label = tk.Label(root, textvariable=text_var)
label.pack()

root.mainloop()


이벤트 처리
Tkinter 이벤트 처리는 사용자가 키보드 키를 누르거나 마우스를 클릭하는 등의 동작에 반응하여 작동하는 애플리케이션을 구축하는 데 사용됩니다. 이벤트 처리를 위해 bind() 메서드를 사용하여 이벤트와 콜백 함수를 연결할 수 있습니다.

import tkinter as tk

def on_key_press(event):
    print(f"Key pressed: {event.char}")

root = tk.Tk()

root.bind("<KeyPress>", on_key_press)

root.mainloop()


기하 관리자
기하 관리자는 위젯을 루트 윈도우나 Frame 위젯에 배치하는 방법을 제어합니다. Tkinter는 pack(), grid(), place()와 같은 다양한 기하 관리자를 제공합니다. 이들을 사용하여 복잡한 레이아웃을 구성할 수 있습니다.

import tkinter as tk

root = tk.Tk()

label1 = tk.Label(root, text="Label 1")
label2 = tk.Label(root, text="Label 2")
label3 = tk.Label(root, text="Label 3")

label1.grid(row=0, column=0)
label2.grid(row=0, column=1)
label3.grid(row=1, column=0, columnspan=2)

root.mainloop()


사용자 정의 위젯
사용자 정의 위젯을 만들어 표준 Tkinter 위젯을 확장할 수 있습니다. 사용자 정의 위젯은 특정 목적에 맞게 동작하도록 구성된 클래스입니다.

import tkinter as tk

class CustomButton(tk.Button):
    def __init__(self, master=None, **kwargs):
        super().__init__(master, **kwargs)
        self["text"] = "Custom Button"
        self["command"] = self.print_message

    def print_message(self):
        print("This is a custom button!")

root = tk.Tk()

button = CustomButton(root)
button.pack()

root.mainloop()


위 예제들은 Tkinter를 사용하여 복잡한 인터페이스를 구축하는 데 필요한 기본 개념들을 보여줍니다. 이러한 개념을 응용하여 다양한 사용자 인터페이스를 구축할 수 있습니다. Tkinter를 사용하여 더 복잡한 인터페이스를 구현하려면, 다음과 같은 추가적인 고려사항이 있습니다.

메뉴와 서브메뉴
메뉴와 서브메뉴를 사용하여 응용 프로그램에 다양한 기능을 제공할 수 있습니다. Tkinter의 Menu 클래스를 사용하여 메뉴를 구현할 수 있습니다.

import tkinter as tk

def on_quit():
    root.destroy()

root = tk.Tk()

menubar = tk.Menu(root)
root.config(menu=menubar)

file_menu = tk.Menu(menubar)
menubar.add_cascade(label="File", menu=file_menu)

file_menu.add_command(label="Quit", command=on_quit)

root.mainloop()


대화상자
Tkinter는 사용자에게 정보를 요청하거나 경고 메시지를 표시하는 데 사용할 수 있는 여러 종류의 대화상자를 제공합니다. 예를 들어, 파일 열기 대화상자나 메시지 박스를 사용할 수 있습니다.

import tkinter as tk
from tkinter import filedialog, messagebox

def on_open_file():
    filepath = filedialog.askopenfilename()
    print(f"Selected file: {filepath}")

def on_show_message():
    messagebox.showinfo("Message", "This is an info message!")

root = tk.Tk()

open_button = tk.Button(root, text="Open File", command=on_open_file)
open_button.pack()

message_button = tk.Button(root, text="Show Message", command=on_show_message)
message_button.pack()

root.mainloop()


스타일링과 테마
Tkinter 애플리케이션의 외관을 사용자 지정하려면, ttk 모듈의 스타일 기능을 사용할 수 있습니다. 테마를 적용하고 위젯의 스타일 속성을 설정하여 애플리케이션의 외관을 변경할 수 있습니다.

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

style = ttk.Style()
style.configure("TButton", font=("Arial", 14), background="blue")

button = ttk.Button(root, text="Styled Button")
button.pack()

root.mainloop()

 

이러한 고급 기능들을 익히고 적용하면, Tkinter를 사용하여 기능과 외관 모두 사용자가 원하는 대로 구성된 복잡한 인터페이스를 구축할 수 있습니다. 다양한 예제와 자습서를 통해 Tkinter에 대한 이해를 높이고, 다양한 프로젝트에 적용해보세요.

728x90

'Python for Beginners' 카테고리의 다른 글

12.4 기타 GUI 라이브러리(PyQt, Kivy 등)  (0) 2023.04.04
12.3 이벤트 처리  (0) 2023.04.04
12.1 Tkinter 소개  (0) 2023.04.04
11.3 비동기 프로그래밍  (0) 2023.04.01
11.2 멀티스레딩 및 멀티프로세싱  (0) 2023.04.01