본문 바로가기
GUI 튜토리얼/tkinter 한꼬집씩만 따라해보기

19. 라디오버튼 선택에 따라 작동하는 함수 추가하기

by 일코 2022. 11. 18.

지난 포스팅

2022.11.17 - [기타/tkinter 한꼬집씩만 따라해보기] - 18. 라디오버튼 만들기

 

18. 라디오버튼 만들기

지난 포스팅 2022.11.16 - [기타/tkinter 한꼬집씩만 따라해보기] - 17. sticky로 위젯 정렬하기 #도전과제 17. sticky로 위젯 정렬하기 #도전과제 지난 포스팅 지난 포스팅에서는 체크박스 및 체크박스의 상

martinii.fun


 

이번 포스팅에서는 : 라디오버튼으로 배경색 바꾸기

import tkinter as tk


def radio_callback():
    rad_selected = rad_var.get()
    if rad_selected == 1:
        win.configure(background="Red")
    elif rad_selected == 2:
        win.configure(background="Green")
    elif rad_selected == 3:
        win.configure(background="Blue")


win = tk.Tk()

rad_var = tk.IntVar()  # 0으로 초기화됨

tk.Radiobutton(win, text="Red", value=1, variable=rad_var, command=radio_callback).grid(row=0, column=0, sticky="w")  # value가 0인 경우에는 선택상태가 되는 불편함
tk.Radiobutton(win, text="Green", value=2, variable=rad_var, command=radio_callback).grid(row=1, column=0, sticky="w")  # value가 StringVar인 경우에도 값과 무관하게 선택되는 불편함
tk.Radiobutton(win, text="Blue", value=3, variable=rad_var, command=radio_callback).grid(row=2, column=0, sticky="w")

win.mainloop()

 

이번 포스팅에서는 라디오버튼 선택에 따라 메인윈도우인 win의 백그라운드 색이 변경되는 예제를 소개해 드리겠습니다.

대부분 설명드렸던 개념이기도 하고, 짧은 예제라서 특별히 설명드릴만한 내용도 없는 것 같습니다.

다만 주의하실 점이 하나 있습니다. 실행화면을 보여드리고 난 후에 설명드리겠습니다.

위 코드를 실행해보면

의도한 대로 잘 작동합니다.

이제 라디오버튼을 생성할 때 몇 가지 주의사항을 알려드리겠습니다.

1. 라디오버튼의 value를 문자열로 지정하지 맙시다.

어떤 분들은 이렇게 생각하실 수도 있겠습니다.

라디오버튼의 value에 1, 2, 3을 지정하지 말고, 직접 "Red", "Green", "Blue"를 지정하면,
위에서 정의한 콜백함수가 훨씬 짧아지지 않을까?

그런데 이렇게 실행하면 예상치 못한 효과가 나타납니다.

문자열이 비어있지 않은 이상 True/False 중 True로 인식해 버리기 때문에

라디오버튼이 모두 "선택상태"입니다.

import tkinter as tk


def radio_callback():
    win.configure(background=rad_var.get())  # <--- 함수 간소화


win = tk.Tk()

rad_var = tk.StringVar()  # <--- ""로 초기화됨

tk.Radiobutton(win, text="Red", value="Red", variable=rad_var, command=radio_callback).grid(row=0, column=0, sticky="w")
tk.Radiobutton(win, text="Green", value="Green", variable=rad_var, command=radio_callback).grid(row=1, column=0, sticky="w")
tk.Radiobutton(win, text="Blue", value="Blue", variable=rad_var, command=radio_callback).grid(row=2, column=0, sticky="w")
#                                         ↑ value를 문자열로 수정함
win.mainloop()

위 코드는 아무 문제 없어 보이지만 막상 실행해보면?

창이 열리자 마자 라디오버튼 세 개 전부 선택이 되어 있는 상태입니다.

우리가 의도하지 않은 결과네요. 라디오버튼의 초기 value는 가급적 문자열로는 지정하지 맙시다.

2. 라디오버튼의 value에 0도 넣지 맙시다.

제일 위의 예제코드를 보면 value를 1, 2, 3으로 지정해 두었습니다.

아니, 자고로 파이썬 프로그램이라면 라디오버튼의 value에다 파이써닉하게 0부터 지정해야지
0, 1, 2를 지정하지 않고 1, 2, 3을 넣은 거지?

약간 억지스럽지만 위처럼 생각할 수도 있을 것 같습니다. 저도 0-index가 편할 때가 있는데

tkinter의 라디오버튼의 value에 0을 지정하면 위의 문자열과 마찬가지로 "선택상태"가 되어버립니다.

import tkinter as tk


def radio_callback():
    rad_selected = rad_var.get()
    if rad_selected == 0:
        win.configure(background="Red")
    elif rad_selected == 1:
        win.configure(background="Green")
    elif rad_selected == 2:
        win.configure(background="Blue")


win = tk.Tk()

rad_var = tk.IntVar()  # 0으로 초기화됨

tk.Radiobutton(win, text="Red", value=0, variable=rad_var, command=radio_callback).grid(row=0, column=0, sticky="w")  # value가 0인 경우에는 선택상태가 되는 불편함
tk.Radiobutton(win, text="Green", value=1, variable=rad_var, command=radio_callback).grid(row=1, column=0, sticky="w")  # value가 StringVar인 경우에도 값과 무관하게 선택되는 불편함
tk.Radiobutton(win, text="Blue", value=2, variable=rad_var, command=radio_callback).grid(row=2, column=0, sticky="w")

win.mainloop()

 

실행해보면(value에 0이 할당된 첫 번째 라디오버튼에 주목해주세요.)

창이 열리는 시점에 Red라디오버튼이 선택되어 있습니다.

이것도 우리가 의도하지 않은 결과죠.

이런 이유로 라디오버튼의 value는 가급적 정수로 지정하되 0은 빼고! 기억해 두세요^^

 


다음 포스팅

2022.11.18 - [기타/tkinter 한꼬집씩만 따라해보기] - 20. 텍스트박스 만들기

 

20. 텍스트박스 만들기

지난 포스팅 2022.11.18 - [기타/tkinter 한꼬집씩만 따라해보기] - 19. 라디오버튼 선택에 따라 작동하는 함수 추가하기 19. 라디오버튼 선택에 따라 작동하는 함수 추가하기 지난 포스팅 2022.11.17 - [기

martinii.fun

 

댓글