파이썬/파이썬(python) 중급

[27-6 파이썬] Tkinter Tk, Label, Entry, Text, Scale, Checkbutton, Radiobutton, Listbox, insert(), END

Olivia-BlackCherry 2022. 9. 15. 07:48

오늘은 Tkinter의 내부 여러 기능들을 살펴본다.

 

import  *
from tkinter import *

tkinter에서 모든 것(*)을 가져온다.

 

 

Tk()
window = Tk()
window.title("Widget Examples")
window.minsize(width=600, height=600)



window.mainloop()

Tk 클래스에서 window 객체를 생성하고

title()로 제목을 지정하고,

minsize()로 width 너비, height 높이를 지정한다.

mainloop()로 화면이 꺼지지 않고 계속 열려있게 만든다.

 

 

Label()

label = Label(text="ABCDEFG")
label.config(text="abcdefg")
label.pack()

창에 글자를 각인해준다.

처음에 Label 객체 label을 만들 때 ABCDEFG를 썼다. 

그 뒤, config()를 이용해서 abcdefg로 덮어썼다.

 

 

 

Button()

def action():
    print("버튼을 눌렀네요!?")

button = Button(text="클릭해주세요", command=action)
button.pack()

버튼이 생성된다. 

클릭해주세요 버튼을 누르면, command--> action함수가 실행된다.

 

 

 

Entry()

entry = Entry(width=30)
#string에 맨 처음 화면에 보이는 말 적기
entry.insert(END, string="맨 처음 보이는 말")
#entry에서 string 가져오기
print(entry.get())
entry.pack()

Entry는 한 줄의 문장을 넣을 수 있는 글상자를 만든다.

Entry객체 entry를 생성한다. 너비는 30으로 한다. 

 

insert(index, string) 메소드로 entry 안에 들어갈 말(string)을 index위치에 적는다. 

ENDstring글자가 들어갈 index위치로, 그 입력 필드 안의 맨 마지막 문자를 나타내는 상수이다.

만약 index0이라면 0번 문자 자리에 삽입된다.

 

get() 메소드로 entry에서 string 가져오고

pack()으로 화면에 보이도록 한다. 

 

 

 

 

Text()

text = Text(height=5, width=30)
text.focus()
text.insert(END, "여러 줄을 쓸 수 있는 entry라고 생각하면 좋아요!.")
print(text.get("2.5", END))
text.pack()

Text는 빈칸에 여러 줄의 글상자를 만든다.

Text클래스에서 세로 글자수 5, 가로 글자수 30인 text 객체를 생성한다. 

focus() 메서드로 마우스 커서를 글상자 안에 둔다.

insert() 메서드로 보여주고 싶은 글자를 적고, END로 이미 쓰여져 있는 글자 뒤에 그 글자가 오도록 위치를 지정한다.

get() 메서드로 텍스트에 쓰인 글자를 가져온다. 

 

여기서 숫자 "1.0", "2.5"의 의미를 살펴보자. 

 

관련하여 stackoverflow에서 설명하는 해석을 보자면,

앞 숫자는 '줄 line' 위치, 뒤 숫자는 '글자 character' 위치를 뜻한다.

 

'1.0' 이라면

글상자에서 첫 번째 줄부터 읽기 시작하고, 

0번째 글자(최초)부터 읽기 시작하겠다는 의미다.

 

'3.5이라면

글상자에서 세 번째 줄부터 읽기 시작하고, 

0에서부터 5번째 글자부터 읽기 시작하겠다는 의미다.

 

여기서  END는 문자 끝까지 읽겠다는 의미이다.

text = Text(height=5, width=30)
text.focus()
text.insert(END, "여러 줄을 쓸 수 있는 entry라고 생각하면 좋아요!여러 줄을 쓸 수 있는 entry라고 생각하면 좋아요!\n"
                 "둘 여러 줄을 쓸 수 있는 entry라고 생각하면 좋아요!여러 줄을 쓸 수 있는 entry라고 생각하면 좋아요!\n "
                 "셋 여러 줄을 쓸 수 있는 entry라고 생각하면 좋아요!.")
print(text.get("3.5", END))
text.pack()

window.mainloop()

 

 

※ 스택오버플로어에 나온 설명을 참고하자.

 

Spinbox()

def spinbox_used():
    print(spinbox.get())
spinbox = Spinbox(from_=0, to=10, width=5, command=spinbox_used)
spinbox.pack()

화살표를 누르면, 숫자가 올라가는 spinbox이다. 

객체를 생성할 때, from ~부터, to ~까지의 숫자를 입력하고, 

스핀박스의 너비 width,

스핀박스를 눌렀을 때 실행할 명령 command 값으로 spinbox_used를 지정한다.

스핀박스를 화면에 보이게 하기 위해 pack()을 호출한다.

 

 

Scale()
def scale_used(value):
    print(value)
scale = Scale(from_=0, to=100, command=scale_used)
scale.pack()

바를 이용하여 시각적으로 범위를 조절할 수 있다.

scale 객체를 생성하고, 

from ~부터, to ~까지 숫자를 입력하며,

스케일을 눌렀을 때 실행할 명령으로 scale_used를 괄호 없이 지정한다.

스케이을 화면에 보이도록 pack()메소드를 쓴다.

 

 

변수 선언

tkinter에서는 문자열, 정수, 실수, 불린 변수를 가져올 때, 파이썬에서처럼 그냥 가져오면 에러가 난다!

tkinter에서는 꼭! 반드시! 변수 선언을 해줘야 한다.

- 문자열 StringVar

- 정수형 IntVar

- 실수형 DoubleVar

- 불린형 BooleanVar

 

 

Checkbutton()

def checkbutton_used():
    print(variable_state.get())
variable_state = BooleanVar()
checkbutton = Checkbutton(text="On인가요?", variable=variable_state, command=checkbutton_used)
variable_state.get()
checkbutton.pack()

체크버튼은 체크할 수 있는 칸을 생성한다. 중복 체크가 가능하다. 

변수를 선언한다. 여기서는 불린형으로 선언했기 때문에 

체크를 하면 True, 체크를 해제하면 False로 콘솔창에 출력된다.

만약 IntVar로 변수 선언했다면 1, 0의 값으로 나왔을 것이다. 

Checkbutton에 대한 객체를 만들고, text, variable, command(명령)를 지정하고

get() 메소드로 해당 값을 가져와, 

pack() 메소드로 화면에 정렬한다.

 

 

 

Radiobutton()

def radio_used():
    print(radio_state.get())
radio_state = IntVar()
radiobutton1 = Radiobutton(text="옵션1", value=1, variable=radio_state, command=radio_used)
radiobutton2 = Radiobutton(text="옵션2", value=2, variable=radio_state, command=radio_used)
radiobutton1.pack()
radiobutton2.pack()

체크박스와 거의 유사하나, radiobutton은 중복으로 체크할 수 없고, 단 한개만 체크가 가능하다!

하나를 선택하면, 나머지는 자동으로 해제된다.

 

radiobutton이라는 객체를 생성할 때 인자가 매우 중요하다. 

text : 버튼 이름 또는 버튼 설명이다.

value: 버튼을 선택하면 반환되는 값이다.

variable: 위의 value의 변수타입이다. value가 int형이면 variable도 int형이, string이면 string형이 되야한다.

command: 버튼을 눌렀을 때 호출되는 함수이다.

 

위의 코드에서는 value 값이 1, 2이므로 변수 역시IntVar()로 선언한다.

IntVar()에 저장된 변수는 get메소드로 불러올 수 있다.

 

한편,  value를 지정해주는 것은

그리고 옵션1과 옵션2를 묶어주는 역할도 한다.

만약 value가 지정되지 않으면, 서로의 라디오버튼이 관계가 없어 

개별적으로 존재하기 때문에

각각 체크된다.

def radio_used():
    print(radio_state.get())
radio_state = IntVar()
radiobutton1 = Radiobutton(text="옵션1", command=radio_used)
radiobutton2 = Radiobutton(text="옵션2", value=2, variable=radio_state, command=radio_used)
radiobutton1.pack()
radiobutton2.pack()

 

 

Listbox()

def listbox_used(event):
    print(listbox.get(listbox.curselection()))

listbox = Listbox(height=3)
characters = ["A", "B", "C"]
for chr in characters:
    listbox.insert(characters.index(chr), chr)
listbox.bind("<<ListboxSelect>>", listbox_used)
listbox.pack()

선택할 목록들을 아래로 나열하는 선택지 박스이다.

리스트박스를 생성한 후, 그 안에 들어갈 내용을 집어넣는 구조로 코드를 짠다.

Listbox 클래스에서 listbox 객체를 생성할 때, width 너비, height 높이를 설정할 수 있다.

insert(순서, 들어갈 내용) : 해당 순서에 들어갈 내용을 적는다. 

listbox.insert(characters.index(chr), chr)
characters.index(chr) : characters리스트에서 chr의 index값을 반환(순서)
chr : 문자 내용(항목)

 

 

<최종코드>

from tkinter import *

#새로운 윈도우를 만들고, 제목과 사이즈를 지정한다.
window = Tk()
window.title("Widget Examples")
window.minsize(width=600, height=600)

#Labels
label = Label(text="ABCDEFG")
label.config(text="abcdefg")
label.pack()

#Buttons
def action():
    print("버튼을 눌렀네요!?")

#누르면 action함수를 호출한다.
button = Button(text="클릭해주세요", command=action)
button.pack()

#Entries
entry = Entry(width=30)
#string에 맨 처음 화면에 보이는 말 적기
entry.insert(END, string="맨 처음 보이는 말")
#entry에서 string 가져오기
print(entry.get())
entry.pack()

#Text
text = Text(height=5, width=30)
text.focus()
text.insert(END, "여러 줄을 쓸 수 있는 entry라고 생각하면 좋아요!여러 줄을 쓸 수 있는 entry라고 생각하면 좋아요!\n"
                 "둘 여러 줄을 쓸 수 있는 entry라고 생각하면 좋아요!여러 줄을 쓸 수 있는 entry라고 생각하면 좋아요!\n "
                 "셋 여러 줄을 쓸 수 있는 entry라고 생각하면 좋아요!.")
print(text.get("3.5", END))
text.pack()

def spinbox_used():
    print(spinbox.get())
spinbox = Spinbox(from_=0, to=10, width=5, command=spinbox_used)
spinbox.pack()

#Scale
def scale_used(value):
    print(value)
scale = Scale(from_=0, to=100, command=scale_used)
scale.pack()

def checkbutton_used():
    print(variable_state.get())
variable_state = IntVar()
checkbutton = Checkbutton(text="On인가요?", variable=variable_state, command=checkbutton_used)
variable_state.get()
checkbutton.pack()



#radio
def radio_used():
    print(radio_state.get())
radio_state = IntVar()
radiobutton1 = Radiobutton(text="옵션1", command=radio_used)
radiobutton2 = Radiobutton(text="옵션2", value=2, variable=radio_state, command=radio_used)
radiobutton1.pack()
radiobutton2.pack()


#Listbox
def listbox_used(event):
    print(listbox.get(listbox.curselection()))

listbox = Listbox(height=3)
characters = ["A", "B", "C"]
for chr in characters:
    listbox.insert(characters.index(chr), chr)
listbox.bind("<<ListboxSelect>>", listbox_used)
listbox.pack()


window.mainloop()