Tkinter를 사용한 Python GUI 프로그래밍1

2023. 12. 19. 18:09python/basic

Python에는 GUI 프레임워크가 많지만 Tkinter는 Python 표준 라이브러리에 내장된 유일한 프레임워크입니다. Tkinter에는 몇 가지 장점이 있습니다. 크로스 플랫폼이므로 동일한 코드가 Windows, macOS 및 Linux에서 작동합니다. 시각적 요소는 기본 운영 체제 요소를 사용하여 렌더링되므로 Tkinter로 구축된 애플리케이션은 실행되는 플랫폼에 속한 것처럼 보입니다.

  • Hello, World 애플리케이션과 함께 Tkinter 시작하기
  • 버튼 및 텍스트 상자와 같은 위젯 작업
  • 지오메트리 관리자를 사용하여 애플리케이션 레이아웃 제어
  • 버튼 클릭을 Python 함수와 연결하여 애플리케이션을 대화형으로 만듭니다.

Tkinter를 사용하여 첫 번째 Python GUI 애플리케이션 구축

Tkinter GUI의 기본 요소는 창입니다. Windows는 다른 모든 GUI 요소가 있는 컨테이너입니다. 텍스트 상자, 라벨, 버튼과 같은 기타 GUI 요소를 위젯이라고 합니다. 위젯은 창 내부에 포함되어 있습니다.

메모리 공간을 절약하기 위해 Ubuntu Linux 20.04에 사전 설치된 Python 인터프리터의 기본 버전은 Tkinter를 지원하지 않습니다. 그러나 운영 체제와 함께 번들로 제공되는 Python 인터프리터를 계속 사용하려면 다음 패키지를 설치하십시오.

$ sudo apt-get install python3-tk

Python 셸을 연 상태에서 가장 먼저 해야 할 일은 Python GUI Tkinter 모듈을 가져오는 것입니다.

In [ ]:
import tkinter as tk
In [ ]:
window = tk.Tk()

위젯 추가

In [ ]:
greeting = tk.Label(text="Hello, Tkinter")
In [ ]:
greeting.pack()
In [ ]:
window.mainloop()

window.mainloop()은 Python에게 Tkinter 이벤트 루프를 실행하라고 지시합니다. 이 메소드는 버튼 클릭이나 키 누르기와 같은 이벤트를 수신하고, 호출한 창을 닫을 때까지 메소드 뒤에 오는 코드의 실행을 차단합니다.

이해도를 확인하세요

In [ ]:
import tkinter as tk

window = tk.Tk()
label = tk.Label(text="Python rocks!")
label.pack()

window.mainloop()

위젯 작업

현재 Tkinter에는 두 가지 광범위한 위젯 범주가 있다는 점은 주목할 가치가 있습니다.

  • 기본 위젯: tkinter 패키지에서 사용 가능(예: )tkinter.Label
  • 테마 위젯: ttk 하위 모듈에서 사용 가능(예: )tkinter.ttk.Label
  • Tkinter의 클래식 위젯은 사용자 정의가 가능하고 간단하지만 오늘날 대부분의 플랫폼에서 구식이거나 다소 낯설게 보이는 경향이 있습니다. 해당 운영 체제의 사용자에게 친숙한 기본 모양과 느낌을 갖춘 위젯을 활용하고 싶다면 확인해 보세요.

대부분의 테마 위젯은 레거시 위젯을 거의 즉시 대체할 수 있지만 모양은 더욱 현대적입니다. 또한 이전에는 Tkinter에서 사용할 수 없었던 진행 표시줄과 같은 몇 가지 새로운 위젯을 사용할 수도 있습니다. 동시에 테마 대안이 없는 일부 기존 위젯을 계속 사용해야 합니다.

참고: tkinter.ttk 모듈의 테마 위젯은 기본적으로 운영 체제의 기본 모양과 느낌을 사용합니다. 그러나 밝은 모드와 어두운 모드 등 사용자 정의된 시각적 모양을 위해 테마를 변경할 수 있습니다. 테마는 Tkinter용 캐스케이딩 스타일 시트(CSS)로 생각할 수 있는 재사용 가능한 스타일 정의 모음입니다.

새 위젯에 테마를 적용한다는 것은 대부분의 스타일 정보를 별도의 개체로 추출한다는 의미였습니다. 한편으로는 이러한 관점의 분리는 라이브러리 설계에서 바람직한 속성이지만 다른 한편으로는 추가적인 추상화 계층을 도입합니다. 따라서 테마 위젯은 클래식 위젯보다 스타일을 지정하기가 더 어렵습니다.

Tkinter에서 일반 위젯과 테마 위젯으로 작업할 때 Tkinter 패키지와 모듈에 대해 다음 별칭을 선언하는 것이 일반적입니다:

In [ ]:
import tkinter as tk
import tkinter.ttk as ttk
In [ ]:
tk.Label()
In [ ]:
ttk.Label()
In [ ]:
from tkinter import *
from tkinter.ttk import *

Label()
In [ ]:
Text()

위젯을 사용하여 텍스트 및 이미지 표시Label위젯

In [ ]:
label = tk.Label(text="Hello, Tkinter")
In [ ]:
label = tk.Label(
    text="Hello, Tkinter",
    foreground="white",  # Set the text color to white
    background="black"  # Set the background color to black
)
In [ ]:
label = tk.Label(text="Hello, Tkinter", background="#34A2FE")
In [ ]:
label = tk.Label(
    text="Hello, Tkinter",
    fg="white",
    bg="black",
    width=10,
    height=10
)

참고: 너비와 높이 측정의 경우 Tkinter는 인치, 센티미터, 픽셀 등이 아닌 텍스트 단위를 사용하여 플랫폼 전반에서 애플리케이션의 일관된 동작을 보장합니다.

Button 위젯으로 클릭 가능한 버튼 표시

In [ ]:
button = tk.Button(
    text="Click me!",
    width=25,
    height=5,
    bg="blue",
    fg="yellow",
)

Entry 위젯으로 사용자 입력 받기

In [ ]:
entry = tk.Entry(fg="yellow", bg="blue", width=50)

Entry 위젯으로 수행할 수 있는 주요 작업은 세 가지입니다.

  1. 텍스트 검색 : .get()
  2. 텍스트 삭제 : .delete()
  3. 텍스트 삽입 : .insert()
In [ ]:
import tkinter as tk
window = tk.Tk()
In [ ]:
label = tk.Label(text="Name")
entry = tk.Entry()
In [ ]:
label.pack()
entry.pack()

마우스로 Entry 위젯 내부를 클릭하고 Real Python:를 입력하세요.

이제 Entry 위젯에 일부 텍스트가 입력되었지만 해당 텍스트는 아직 프로그램으로 전송되지 않았습니다. .get()를 사용하여 텍스트를 검색하고 name:라는 변수에 할당할 수 있습니다.

In [ ]:
name = entry.get()
name

그러면 'Real Python'이 출력됩니다.

아래 코드 블록은 .delete(0)이 Entry에서 첫 번째 문자를 삭제하는 방법을 보여줍니다.

In [ ]:
entry.delete(0)

다음 코드는 Entry에서 처음 4자를 삭제합니다.

In [ ]:
entry.delete(0, 4)

모든 텍스트를 제거하려면 의 두 번째 인수에 특수 상수 tk.END를 사용하십시오.

In [ ]:
entry.delete(0, tk.END)

스펙트럼의 반대편 끝에서 Entry 위젯에 텍스트를 삽입할 수도 있습니다.

In [ ]:
entry.insert(0, "Python")

Entry에 이미 일부 텍스트가 포함된 경우 .insert()는 지정된 위치에 새 텍스트를 삽입하고 기존 텍스트를 모두 오른쪽으로 이동합니다.

In [ ]:
entry.insert(0, "I Love ")

Text 위젯을 사용하여 여러 줄 사용자 입력 받기

Text 위젯은 Entry 위젯과 마찬가지로 텍스트를 입력하는 데 사용됩니다. 차이점은 Text 위젯에는 여러 줄의 텍스트가 포함될 수 있다는 것입니다.

참고: 이전 섹션의 창이 아직 열려 있습니까?

그렇다면 다음을 실행하여 닫을 수 있습니다.

In [ ]:
window.destroy()

Python 셸에서 새 빈 창을 만들고 그 안에 Text() 위젯을 압축합니다.

In [ ]:
window = tk.Tk()
text_box = tk.Text()
text_box.pack()

창 내부 아무 곳이나 클릭하면 텍스트 상자가 활성화됩니다. Hello라는 단어를 입력하세요. 그런 다음 Enter를 누르고 두 번째 줄에 World를 입력하십시오.

Entry 위젯과 마찬가지로 .get()을 사용하여 Text 위젯에서 텍스트를 검색할 수 있습니다. 그러나 인수 없이 .get()를 호출하면 위젯처럼 텍스트 상자에 전체 텍스트가 반환되지 않습니다. 예외가 발생합니다.

>>> text_box.get() Traceback (most recent call last): ... TypeError: get() missing 1 required positional argument: 'index1'

Text.get()에는 하나 이상의 인수가 필요합니다. 단일 색인으로 .get()을 호출하면 단일 문자가 반환됩니다. Text 위젯에는 여러 줄의 텍스트가 포함될 수 있으므로 색인에는 두 가지 정보가 포함되어야 합니다.

  1. 문자의 줄 번호
  2. 해당 줄의 문자 위치

줄 번호는 1로 시작하고 문자 위치는 0로 시작합니다. 색인을 만들려면 "

색인을 사용"1.0"하여 이전에 만든 텍스트 상자에서 첫 글자를 가져옵니다.

In [ ]:
text_box.get("1.0")
In [ ]:
text_box.get("1.0", "1.5")
In [ ]:
text_box.get("2.0", "2.5")

텍스트 상자의 모든 텍스트를 가져오려면 "1.0"에 시작 색인을 설정하고 두 번째 색인에 특수 tk.END 상수를 사용하세요.

In [ ]:
text_box.get("1.0", tk.END)

.delete()은 텍스트 상자에서 문자를 삭제하는 데 사용됩니다. 이는 .delete() Entry 위젯과 동일하게 작동합니다. .delete():를 사용하는 방법에는 두 가지가 있습니다.

  1. 단일 인수사용
  2. 두 개의 인수 사용
In [ ]:
text_box.delete("1.0")

이제 창의 첫 번째 텍스트 줄은 ello 와 같이 보입니다.

두 개의 인수 버전을 사용하면 두 개의 인덱스를 전달하여 첫 번째 인덱스에서 시작하여 두 번째 인덱스까지(포함하지 않음)의 문자 범위를 삭제합니다. 예를 들어 텍스트 상자 첫 번째 줄의 나머지 ello를 삭제하려면 색인 "1.0" 및 "1.4"를 .delete에 넣습니다.

In [ ]:
text_box.delete("1.0", "1.4")

눈에 보이지는 않지만 첫 줄에는 여전히 문자가 있습니다. 개행 문자입니다.

개행 문자를 삭제하면 텍스트 상자의 나머지 내용이 한 줄 위로 이동합니다.

In [ ]:
text_box.delete("1.0")

.insert():을 사용하여 텍스트 상자에 텍스트를 삽입할 수 있습니다.

In [ ]:
text_box.insert("1.0", "Hello")

새 줄에 텍스트를 삽입하려면 삽입되는 문자열에 새 줄 문자를 수동으로 삽입해야 합니다.

In [ ]:
text_box.insert("2.0", "\nWorld")

Text 위젯 끝에 텍스트를 삽입하는 가장 좋은 방법은 tk.END를 .insert()의 첫 번째 매개변수에 전달하는 것입니다.

In [ ]:
text_box.insert(tk.END, "Put me at the end!")

새 줄에 넣으려면 텍스트 시작 부분에 새 줄 문자(\n)를 포함하는 것을 잊지 마세요.

In [ ]:
text_box.insert(tk.END, "\nPut me on a new line!")

다음에는 widgetsFrameWidget을 사용하여 프레임에 위젯을 할당하기 편입니다.