라디오 버튼과 체크박스

라디오 버튼

라디오 버튼(radio buttion)은 체크 박스와 비슷하지만 하나의 그룹 안에서는 한 개의 버튼만 선택할 수 있다는 점이 다릅니다.

만약 하나의 라디오 버튼을 클릭하면 다른 버튼은 자동적으로 선택이 해제됩니다.

라디오 버튼은 라디오 방송국을 선택하는 카오디오에서 사용되는 물리적 버튼의 이름을 따서 명명되었습니다. 라디오 버튼을 누를 경우, 다른 버튼이 튀어 나옵니다.

car radio button에 대한 이미지 검색결과

 

때때로 옵션 버튼이라 불리는 라디오 버튼은, 사용자가 여러 개의 선택사항 중에서 하나를 선택할 수 있게 합니다.

라디오 버튼은 텍스트나 이미지를 포함할 수 있습니다. 라디오 버튼은 하나의 글꼴로만 텍스트를 표시할 수 있습니다.

함수가 라디오 버튼에 등록될 수 있습니다. 라디오 버튼을 누르면 등록된 함수가 호출됩니다.

 

동일한 변수와 연관된 라디오 버튼들은 모두 동일한 그룹에 속하는 것으로 판단합니다. 버튼을 누르면 미리 정의된 특정한 값으로 변수의 값을 변경합니다.

 

가장 선호하는 프로그래밍 언어를 선택하는 윈도우를 작성하여 봅시다. choice라는 정수형 변수를 생성하고 이것을 4개의 라디오 버튼과 연관시킵니다.

from tkinter import *

window = Tk()
choice = IntVar()   # 정수형 변수 choice를 생성합니다.

Label(window, text = "가장 선호하는 프로그래밍 언어를 선택하세요.", justify = LEFT, padx = 20).pack()
Radiobutton(window, text = "Python", padx = 20, variable = choice, value = 1).pack(anchor = W)  # 왼쪽에 붙입니다.
Radiobutton(window, text = "C", padx = 20, variable = choice, value = 2).pack(anchor = W)
Radiobutton(window, text = "Java", padx = 20, variable = choice, value = 3).pack(anchor = W)
Radiobutton(window, text = "Swift", padx = 20, variable = choice, value = 4).pack(anchor = W)

mainloop()

 

<실행 결과>

 

라디오 버튼의 개수가 많아지고 위와 같이 각각의 문장으로 버튼을 생성한다면 매우 귀찮을 것입니다. 아래의 예제는 이것을 개선한 것입니다.

우리는 버튼의 텍스트와 해당 값을 저장하는 리스트를 생성하고 반복 루프를 이용하여 필요한 라디오 버튼들을 생성합니다.

from tkinter import *

window = Tk()
select = IntVar()   # 정수형 변수 choice를 생성합니다.
select.set(1)

list = [("Python", 1), ("C", 2), ("Java", 3), ("Switft", 4)]

def PrintChoice():
    print(select.get())

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

for txt, val in list:
    Radiobutton(window, text = txt, padx = 20, variable = select, command = PrintChoice, value = val).pack(anchor = W)

mainloop()

 

<실행 결과>

 

체크박스

체크 박스(check box)란 사용자가 클릭하여서 체크된 상태와 체크되지 않은 상태 중의 하나로 만들 수 있는 위젯입니다.

체크 박스는 흔히 사용자로 하여금 YES와 NO 중에서 하나를 선택하게 하는데 사용됩니다.

체크 박스는 사용자가 선택 항목 중에서 여러 개를 동시에 선택할 수 있도록 허용하는 위젯입니다. 이것은 사용자가 하나의 선택만을 할 수 있는 라디오 버튼과는 다릅니다.

 

checkbox에 대한 이미지 검색결과

 

일반적으로, 체크 박스는 화면에 사각형 상자로 표시됩니다. 체크 박스의 상태는 상자에 마우스를 클릭하여 변경됩니다. 체크 박스는 on과 off의 두 가지 상태가 있습니다.

from tkinter import *

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

# sticky = W 옵션이 없다면 셀 안에서 위젯들이 중앙 정렬됩니다.
# W라고 지정하면 왼쪽 정렬이 되며 E(East), W(West), S(South), N(North)를 사용할 수 있습니다.
value1 = IntVar()
# 격자 배치 관리자의 1번째 행에 배치합니다.
Checkbutton(window, text = "Python", variable = value1).grid(row = 1, sticky = W)
value2 = IntVar()
Checkbutton(window, text = "C", variable = value2).grid(row = 2, sticky = W)
value3 = IntVar()
Checkbutton(window, text = "Java", variable = value3).grid(row = 3, sticky = W)
value4 = IntVar()
Checkbutton(window, text = "Swift", variable = value4).grid(row = 4, sticky = W)

mainloop()

 

<실행 결과>

 

리스트 박스 위젯

리스트 박스 위젯(list box widget)은 사용자가 선택할 수 있는 항목들을 메뉴로 보여줍니다. 리스트 박스는 윈도우를 생성한 후에 Listbox() 생성자를 호출하여서 생성합니다.

"height" 매개 변수가 얼마나 많은 라인을 표시할 것인지를 지정합니다.

from tkinter import *

window = Tk()

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

mainloop()

 

<실행 결과>

 

리스트 박스의 크기는 4 라인으로 설정되어 있습니다. insert() 함수의 END는 리스트 박스의 끝(END)에 항목을 추가하라는 의미입니다.

항목은 리스트 박스의 시작 또는 중간에 추가될 수 있습니다. 또한 삭제될 수도 있습니다. 리스트 박스의 모든 항목을 삭제하기 위해서는 "lb.delete(0, END)"를 사용하면 됩니다.

 

리스트 박스는 스크롤바와 함께 사용될 수 있습니다. 위의 코드에 스크롤바를 만드는 소스는 아래와 같습니다.

from tkinter import *

window = Tk()

sb = Scrollbar(window, orient=VERTICAL)
sb.pack(side = RIGHT, fill = Y)

lb = Listbox(window, height = 4)
lb.pack()
lb.insert(END, "Python")
lb.insert(END, "C")
lb.insert(END, "Java")
lb.insert(END, "Swift")
lb.insert(END, "Go")
lb.insert(END, "C++")
lb.insert(END, "C#")

mainloop()

 

<실행 결과>

 

스크롤바를 테스트 하기 위하여 선택 항목을 많이 추가하였습니다. 하지만 스크롤바가 작동하여도 아직 아무것도 하지 않는 것을 볼 수 있습니다.

현재 상태로는 스크롤바와 리스트 박스가 서로 연결되어 있지 않기 때문입니다. 이 두 위젯은 서로에 대해 알 필요가 있습니다.

아래와 같이 상대방의 함수를 위젯에 등록하여야 합니다.

...
sb.configure(command = lb.yview)
lb.configure(yscrollcommand = sb.set)

mainloop()

 

<실행 결과>

 

이제 스크롤바를 조작하고 리스트 박스의 응답을 살펴봅시다. 스크롤바에 따라서 리스트 박스의 항목들이 스크롤되는 것을 알 수 있습니다.

 

사용자가 리스트 박스에서 항목을 선택한 경우, curselection() 이 선택된 항목을 반환합니다. 구체적으로는 선택 항목의 튜플을 반환합니다.

튜플을 반환하는 이유는 사용자가 리스트 박스에서 여러 항목을 동시에 선택할 수 있기 때문입니다. 사용자가 항목을 선택하지 않은 경우에는 비어 있는 튜플이 반환됩니다.

 

예를 들어, 파이썬 쉘에서 리스트 박스의 3번째 항목을 클릭하고 아래를 실행하여 봅시다. 파이썬에서 인덱스는 0에서 시작한다는 점에서 유의합시다.

lb.curselection()

 

<실행 결과>

(2,)