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

10. 특정 위젯을 비활성화하기 #도전과제있음

by 일코 2022. 11. 15.

이전 포스팅

2022.11.15 - [기타/tkinter 한꼬집씩만 따라해보기] - 9. 엔트리 위젯에 placeholder 구현하기 #event binding

 

9. 엔트리 위젯에 placeholder 구현하기 #event binding

import tkinter as tk def focus_in(*args): # 엔트리창에 포커스되는 경우 if id_.get() == placeholder_text: # placegholder가 있으면 entry.delete(0, "end") # 엔트리 값 삭제(시작위치:0, 끝위치:"end") entry.configure(fg="black") #

martinii.fun


 

이번 포스팅에서는

import tkinter as tk

win = tk.Tk()
button = tk.Button(win, text="클릭못하쥬?")
button.grid(row=0, column=0)
button.configure(state="disabled")

win.mainloop()

위젯을 만들다 보면 편의상 사용자의 입력을 제한하거나

특정 입력이 완료되기 전까지 버튼을 비활성화한다든지 하는 기능이 필요한 경우가 있습니다.

위 코드를 실행해보면 버튼이 생성되어 있기는 한데, 클릭할 수 없는 상태입니다.

실행해보면

state 인자는 비단 버튼에만 있는 게 아니라서

지난 포스팅까지 심도있게 다뤘던 엔트리 위젯도 동일하게 비활성화 할 수 있습니다.

import tkinter as tk

win = tk.Tk()
entry = tk.Entry(win)
entry.insert(0, "입력못하쥬?")
entry.grid(row=0, column=0, padx=20, pady=20)
entry.configure(state="disabled")

win.mainloop()

아래에는 제법 유용할 법한 도전과제 하나를 제시해봅니다.

도전과제 : 특정 조건에 버튼 활성화

시리얼 엔트리에 값이 입력되어 있지 않으면 열기 버튼이 비활성화되어 있다가

8자리를 입력하는 시점에 열기 버튼을 활성화하는 코드를 작성해봅시다.

 

참고로 비활성화된 위젯을 활성화하는 문자열은 "enabled"가 아닌 "normal"입니다.

또 다른 힌트는 "이벤트바인딩"입니다.

예시답안은 아래에~

더보기
import tkinter as tk


def check_serial(*args):
    if len(serial.get()) == 8:
        button.configure(state="normal")
    else:
        button["state"] = "disabled"


win = tk.Tk()

serial = tk.StringVar()

tk.Label(win, text="8자리 시리얼번호를 입력하세요").grid(row=0, column=0, padx=10, pady=10)

entry = tk.Entry(win, textvariable=serial)
entry.grid(row=0, column=1, padx=10, pady=10)
entry.bind("<KeyRelease>", check_serial)

button = tk.Button(win, text="열기", state="disabled")
button.grid(row=1, column=0, columnspan=2, ipadx=10, ipady=5)  # ipadx, iady는 위젯 내부 여백 설정

win.mainloop()
참고로 키입력 관련 이벤트 중 <Key>가 있는데,
위의 경우에는 <Key>가 아닌 <KeyRelease>를 사용해야 합니다.
그 이유는,
<Key>를 바인딩 이벤트로 사용해버리면, 8번째 숫자를 입력하는 키를 누르는 짧은 시점에
즉, serial의 값이 아직 7자리인 시점에 이벤트가 발동되어버리기 때문입니다.
대신 KeyRelease를 이벤트로 사용하면 8번째 숫자 입력이 완료되고 나서(정말 짧은 시간차이지만)
이벤트가 발생하기 때문에 온전히 8자리의 serial 값을 가져올 수 있습니다.

위 코드를 실행해보면

버튼의 활성화 상태를 주목해 주시기 바랍니다.

 

포스팅을 마치며 

tkinter 포스팅 시리즈를 1번부터 따라해 오셨나요?

이제 여러분도 슬슬 tkinter의 고수가 되고 있다고 느끼시지 않나요?

사실 제가 아는 내용을 거의 다 설명드린 것 같습니다.

저도 PyQt나 tkinter를 통해서 여러 

이어서 남은 위젯들 설명을 간단히 마치고, tkinter의 레이아웃, 룩앤필과 스레드,

그리고 데분러들을 위한 matplotlib 연동하기 정도까지만 설명하고

이 포스팅 시리즈를 마치려고 하거든요.

여러분도, 이 시점에서 포스팅 읽기를 마치고 돌아가셔서

여러분께서 만드신 프로그램에다 GUI라는 날개를 달아보시기를 바랍니다.

부족한 부분은 굳이 이 블로그가 아니라도 검색을 통해서 해결하실 수 있을 거예요.

훌쩍 성장하신 여러분께, 축하의 말씀 드립니다.

 


다음 포스팅

2022.11.16 - [기타/tkinter 한꼬집씩만 따라해보기] - 11. 콤보박스 위젯 추가하기

 

11. 콤보박스 위젯 추가하기

지난 포스팅 지난 포스팅까지 tkinter의 기본적인 위젯들과 간단한 레이아웃, 그리고 command와 이벤트 바인딩의 사용법까지 가볍게 훑어보았습니다. 2022.11.15 - [기타/tkinter 한꼬집씩만 따라해보기]

martinii.fun

 

댓글