728x90
반응형

mina.png
0.12MB

이번엔 Tkinter의 Entry, Text, Checkbox, messagebox에 대해 알아보고 고양이 지수 진단 프로그램을 만들어봤다.

1 텍스트 입력 필드 배치하기

텍스트 입력을 수행하는 파이썬 GUI에는 Entry라는 1행 입력 필드와 Text라는 여러 행 입력 필드가 있다.

1.1 1행 텍스트 입력 필드

1행 입력 필드는 Entry() 명령으로 생성할 수 있고, 텍스트 입력 필드도 마찬가지로 place 명령으로 배치할 수 있다.

import tkinter

root = tkinter.Tk()
root.title("첫번째 텍스트 입력 필드")
root.geometry("400x200")
# 20 문자 크기 입력 필드 컴포넌트 생성
entry = tkinter.Entry(width=20)
# 윈도우에 입력 필드 컴포넌트 배치
entry.place(x=10, y=10)
root.mainloop()

코드를 실행하면 아래와 같이 텍스트를 입력 필드가 생성된다.

 

1.2 Entry 내 문자열 조작하기

Entry 내 문자열은 get() 명령으로 얻을 수 있다.

import tkinter

# 버튼 클릭 시 입력 필드(entry)의 문자열을 받아서 버튼의 문자열에 대입해주는 함수
def click_btn():
    txt = entry.get()
    button["text"] = txt

root = tkinter.Tk()
root.title("첫번째 텍스트 입력 필드")
root.geometry("400x200")
entry = tkinter.Entry(width=20)
entry.place(x=20, y=20)
button = tkinter.Button(text="문자열 얻기", command=click_btn)
button.place(x=20, y=100)
root.mainloop()

코드를 실행한 후에 입력 필드에 아무거나 입력한 후에 버튼을 눌러주면

아래와 같이 버튼의 텍스트가 입력 필드의 문자열로 바뀐다.

Entry 내 문자열을 삭제할 때는 delete(), 삽입할 때는 insert() 명령을 사용할 수 있다.

import tkinter

# 버튼 클릭 시 입력 필드(entry)의 문자열을 받아서 버튼의 문자열에 대입해주는 함수
def click_btn_get():
    txt = entry.get()
    get_button["text"] = txt

# 버튼 클릭 시 버튼의 문자열의 맨 처음 인덱스에 abc를 삽입해주는 함수
def click_btn_insert():
    entry.insert(0, "abc")

# 버튼 클릭 시 버튼의 문자열의 맨 처음 인덱스를 삭제해주는 함수
def click_btn_delete():
    entry.delete(0)
    
root = tkinter.Tk()
root.title("첫번째 텍스트 입력 필드")
root.geometry("400x200")
entry = tkinter.Entry(width=20)
entry.place(x=20, y=20)
get_button = tkinter.Button(text="문자열 얻기", command=click_btn_get)
get_button.place(x=20, y=100)
insert_button = tkinter.Button(text="insert", command=click_btn_insert)
insert_button.place(x=20, y=130)
delete_button = tkinter.Button(text="delete", command=click_btn_delete)
delete_button.place(x=20, y=160)
root.mainloop()

문자열 얻기 버튼은 입력 필드의 텍스트를 가져오고, insert버튼은 입력 필드에 "abc"를 삽입,

delete버튼은 입력 필드의 맨 앞 글자를 지워준다! 

 

2 여러 행 텍스트 입력 필드 배치하기

여려 행 입력 필드는 Text() 명령으로 생성할 수 있다.

Text 내 문자열 조작하기

Entry와 똑같이 Text도 insert, get, delete를 사용해 문자열을 조작할 수 있는데, 예를 들어 입력 필드의 

문자열 전체를 가져오고 싶다면 get("1.0", "end-1c") 같은 방식으로  사용하면 된다. 

1.0은 1행 0번째 문자열, end-1c는 문자열의 끝 인덱스, tkinter.END는 문자열의 끝의 다음 인덱스를 의미한다.

import tkinter

# 버튼 클릭 시 입력 필드의 문자열 전체를 가져오는 함수
def click_btn_get():
    txt = text.get("1.0", "end-1c")
    get_button["text"] = txt

# 버튼 클릭 시 텍스트 입력 필드 마지막에 문자열을 추가해주는 함수
def click_btn_insert():
    text.insert(tkinter.END, "몬스터가 나타났다!")    
    
# 버튼 클릭 시 입력 필드의 문자열 전체를 지워주는 함수
def click_btn_delete():
    text.delete("1.0", "end-1c")
    
root = tkinter.Tk()
root.title("여러 행 텍스트 입력")
root.geometry("400x400")
get_button = tkinter.Button(text="메시지", command=click_btn_get)
get_button.place(x=20, y=120)
insert_button = tkinter.Button(text="insert", command=click_btn_insert)
insert_button.place(x=20, y=240)
delete_button = tkinter.Button(text="delete", command=click_btn_delete)
delete_button.place(x=20, y=280)
text = tkinter.Text()
text.place(x=20, y=10, width=360, height=100)
root.mainloop()

동작은 Entry 때와 똑같다!

 

3 체크 버튼 배치하기

3.1 체크 버튼 배치하기

체크 버튼은 Checkbutton() 명령으로 만들 수 있다.

import tkinter

root = tkinter.Tk()
root.title("체크 버튼 다루기")
root.geometry("400x200")
# 체크 버튼 컴포넌트 생성
cbtn = tkinter.Checkbutton(text="체크 버튼")
# 체크 버튼 컴포넌트 배치
cbtn.pack()
root.mainloop()

코드를 실행하면 아래와 같이 체크 버튼이 생성된다.

 

3.2 체크 여부 확인하기

체크 버튼의 체크 여부는 BooleanVar() 명령을 사용해서 설정할 수 있다.

아래는 체크된 상태의 체크 버튼을 생성해주는 코드인데

import tkinter

root = tkinter.Tk()
root.title("처음부터 체크된 상태 만들기")
root.geometry("400x200")
# BooleanVar() 객체 준비
cval = tkinter.BooleanVar()
# 객체 True 설정
cval.set(True)
cbtn = tkinter.Checkbutton(text="체크 버튼", variable=cval)
cbtn.pack()
root.mainloop()

실행하면 아래와 같이 체크 버튼이 체크된 상태로 생성된 것을 확인할 수 있다.

체크 여부를 확인할 때는 get() 메서드를 사용하면 된다.

import tkinter

# 체크 버튼 클릭 시 체크 여부를 출력해주는 함수
def check():
    if cval.get() == True:
        print("체크되어 있습니다")
    else:
        print("체크되어 있지 않습니다")
    
root = tkinter.Tk()
root.title("처음부터 체크된 상태 만들기")
root.geometry("400x200")
cval = tkinter.BooleanVar()
cval.set(True)
cbtn = tkinter.Checkbutton(text="체크 버튼", variable=cval, command=check)
cbtn.pack()
root.mainloop()

코드를 실행하고 체크 버튼을 누르면 체크 여부가 출력된다.

 

4 메시지 박스 표시하기

메시지 박스를 표시하는 주요 명령어는 아래와 같다.

  • showinfo() -> 정보를 표시해주는 메시지 박스  
  • showwarning() -> 경고를 표시해주는 메시지 박스  
  • showerror() -> 에러를 표시해주는 메시지 박스  
  • askyesno() -> "네", '아니오' 버튼이 있는 메시지 박스  
  • askokcancel() -> 'ok', '취소' 버튼이 있는 메시지 박스

메시지 박스를 사용하기 위해서는 tkinter.messagebox 모듈을 import 해줘야 한다.

import tkinter
import tkinter.messagebox

# 버튼 클릭 시 메시지 박스를 표시해주는 함수
def click_btn():
    tkinter.messagebox.showinfo("정보", "버튼을 눌렀습니다")

root = tkinter.Tk()
root.title("첫번째 메시지 박스")
root.geometry("400x200")
btn = tkinter.Button(text="테스트", command=click_btn)
btn.pack()
root.mainloop()

 

코드를 실행하고 버튼을 누르면 아래와 같이 메시지 박스가 표시된다! 

 

5 고양이 지수 진단 프로그램 만들기

이제 간단한 고양지 지수 진단 프로그램을 만들어보자.

순서대로 코드를 작성해보고 결과를 확인하면 좋을 것 같다!

단계 1: GUI 배치하기

import tkinter

root = tkinter.Tk()
root.title("고양이 지수 진단 게임")
root.resizable(False, False)
canvas = tkinter.Canvas(root, width=800, height=600)
canvas.pack()
gazou = tkinter.PhotoImage(file="mina.png")
canvas.create_image(400, 300, image=gazou)
button = tkinter.Button(text="진단하기", font=("Times New Roman", 32),
                            bg="lightgreen")
button.place(x=400, y=480)
text = tkinter.Text(width=40, height=5, font=("Times New Roman", 16))
text.place(x=320, y=30)
root.mainloop()

 

단계 2: 여러 체크 버튼 배치

import tkinter

root = tkinter.Tk()
root.title("고양이 지수 진단 게임")
root.resizable(False, False)
canvas = tkinter.Canvas(root, width=800, height=600)
canvas.pack()
gazou = tkinter.PhotoImage(file="mina.png")
canvas.create_image(400, 300, image=gazou)
button = tkinter.Button(text="진단하기", font=("Times New Roman", 32),
                            bg="lightgreen")
button.place(x=400, y=480)
text = tkinter.Text(width=40, height=5, font=("Times New Roman", 16))
text.place(x=320, y=30)

# BooleanVal 객체용 리스트
bvar = [None] * 7
# 체크 버튼용 리스트
cbtn = [None] * 7
# 체크 버튼 질문 정의
ITEM = [
    "높은 곳이 좋다",
    "공을 보면 굴리고 싶어진다",
    "깜짝 놀라면 털이 곤두선다",
    "쥐구멍이 마음에 든다",
    "개에게 적대감을 느낀다",
    "생선 뼈를 발라 먹고 싶다",
    "밤, 기운이 난다"
]

# 반복해서 체크 버튼 배치
for i in range(7):
    bvar[i] = tkinter.BooleanVar()
    bvar[i].set(False)
    cbtn[i] = tkinter.Checkbutton(text=ITEM[i], font=("Times New Roman", 12), 
                                    variable=bvar[i], bg="#dfe")
    cbtn[i].place(x=400, y=160 + 40*i)

root.mainloop()

 

단계 3: 체크된 버튼 얻기

import tkinter

# 버튼 클릭 시 체크한 버튼의 개수를 입력 필드에 대입해주는 함수
def click_btn():
    pts = 0
    for i in range(7):
        if bvar[i].get() == True:
            pts += 1
    text.delete("1.0", tkinter.END)
    text.insert("1.0", f"체크된 수는 {pts}")

root = tkinter.Tk()
root.title("고양이 지수 진단 게임")
root.resizable(False, False)
canvas = tkinter.Canvas(root, width=800, height=600)
canvas.pack()
gazou = tkinter.PhotoImage(file="mina.png")
canvas.create_image(400, 300, image=gazou)
button = tkinter.Button(text="진단하기", font=("Times New Roman", 32),
                            bg="lightgreen", command=click_btn)
button.place(x=400, y=480)
text = tkinter.Text(width=40, height=5, font=("Times New Roman", 16))
text.place(x=320, y=30)

# BooleanVal 객체용 리스트
bvar = [None] * 7
# 체크 버튼용 리스트
cbtn = [None] * 7
# 체크 버튼 질문 정의
ITEM = [
    "높은 곳이 좋다",
    "공을 보면 굴리고 싶어진다",
    "깜짝 놀라면 털이 곤두선다",
    "쥐구멍이 마음에 든다",
    "개에게 적대감을 느낀다",
    "생선 뼈를 발라 먹고 싶다",
    "밤, 기운이 난다"
]

# 반복해서 체크 버튼 배치
for i in range(7):
    bvar[i] = tkinter.BooleanVar()
    bvar[i].set(False)
    cbtn[i] = tkinter.Checkbutton(text=ITEM[i], font=("Times New Roman", 12), 
                                    variable=bvar[i], bg="#dfe")
    cbtn[i].place(x=400, y=160 + 40*i)

root.mainloop()

 

 

단계 4: 주석 출력하기

import tkinter

# 버튼 클릭 시 체크한 버튼의 개수를 확인하고 고양이 지수를 출력해주는 함수
def click_btn():
    pts = 0
    for i in range(7):
        if bvar[i].get() == True:
            pts += 1
    nekodo = int(100 * pts / 7)
    text.delete("1.0", tkinter.END)
    text.insert("1.0", f"<진단결과>\n당신의 고양이 지수는 {nekodo}%입니다\n {RESULT[pts]}")

root = tkinter.Tk()
root.title("고양이 지수 진단 게임")
root.resizable(False, False)
canvas = tkinter.Canvas(root, width=800, height=600)
canvas.pack()
gazou = tkinter.PhotoImage(file="mina.png")
canvas.create_image(400, 300, image=gazou)
button = tkinter.Button(text="진단하기", font=("Times New Roman", 32),
                            bg="lightgreen", command=click_btn)
button.place(x=400, y=480)
text = tkinter.Text(width=40, height=5, font=("Times New Roman", 16))
text.place(x=320, y=30)

# BooleanVal 객체용 리스트
bvar = [None] * 7
# 체크 버튼용 리스트
cbtn = [None] * 7
# 체크 버튼 질문 정의
ITEM = [
    "높은 곳이 좋다",
    "공을 보면 굴리고 싶어진다",
    "깜짝 놀라면 털이 곤두선다",
    "쥐구멍이 마음에 든다",
    "개에게 적대감을 느낀다",
    "생선 뼈를 발라 먹고 싶다",
    "밤, 기운이 난다"
]
# 진단 결과 주석을 리스트로 정의
RESULT = [
    "전생에 고양이었을 가능성은 매우 낮습니다.",
    "보통 사람입니다.",
    "특별히 이상한 곳은 없습니다.",
    "꽤 고양이 다운 구석이 있습니다.",
    "고양이와 비슷한 성격 같습니다.",
    "고양이와 근접한 성격입니다.",
    "전생에 고양이었을지도 모릅니다.",
    "겉모습은 사람이지만, 속은 고양이일 가능성이 있습니다."
]

# 반복해서 체크 버튼 배치
for i in range(7):
    bvar[i] = tkinter.BooleanVar()
    bvar[i].set(False)
    cbtn[i] = tkinter.Checkbutton(text=ITEM[i], font=("Times New Roman", 12), 
                                    variable=bvar[i], bg="#dfe")
    cbtn[i].place(x=400, y=160 + 40*i)

root.mainloop()

 

끝! 아래는 최종 결과이다.

 

github: https://github.com/kimjinho1/Python-Game/blob/main/GUI%20%EA%B8%B0%EC%B4%88%202(tkinter)/GUI%20%EA%B8%B0%EC%B4%88%202.ipynb 

 

kimjinho1/Python-Game

Contribute to kimjinho1/Python-Game development by creating an account on GitHub.

github.com

728x90
반응형

+ Recent posts