2017-10-23 3 views
0

아래 코드는 내 프로그램의 일부와 문제가 직면 한 부분을 보여줍니다.MessageBox의 Tkinter 버튼 기능 제어

def checkAnswer(): 
mainAnswer = answer01.get() 
if len(mainAnswer) == 0: 
    messagebox.showwarning(message='Please answer the question!') 
    return 
if int(mainAnswer) != answer: 
    messagebox.showwarning(message='Incorrect! The correct answer is: ' + str(answer)) 
else: 
    nxtquest.config(state=NORMAL) 
    messagebox.showinfo(message='Correct! :)')question01 = Label(easy) 
question01.grid(row=2, column=0) 
answer01 = Entry(easy) 
answer01.grid(row=3, column=2) 
answer01.bind('<Return>', func=lambda e:checkAnswer()) 
start = Button(easy, text = "Start!", command=ask, bg='green', fg='white') 
start.grid(row=3, column=3) 
nxtquest = Button(easy, text='Next Question', command=ask) 
nxtquest.grid(row=5, column=2) 
checkbut = Button(easy, text='Check', command=checkAnswer) 
checkbut.grid(row=4, column=2) 
#check button and answer01 enabled after start pressed 
launch = 1 
if launch == 1: 
    answer01.config(state=DISABLED) 
    checkbut.config(state=DISABLED) 
    nxtquest.config(state=DISABLED) 

여기에서 고민하는 문제는 내가 프로그램을 실행할 때마다 모든 것이 정상이라는 것입니다. 창이 표시되면 checkbut, nxtquest 및 label 대답은 ​​회색으로 표시됩니다 (비활성화 됨). 시작 버튼은 checkbut 및 answer01 만 활성화 한 다음 삭제됩니다. (지금까지는 매우 좋음) 그래서에 표시된대로 입력이 정확하면 nxtquest가 활성화됩니다. nxtquest.config (state = NORMAL) 그러나 다른 질문에 도달하면 nxtquest 버튼이 이미 활성화되어 있습니다. 이것이 문제입니다 !

경고 메시지 상자가 표시된 후에 만 ​​버튼이 활성화되도록하려면 어떻게해야합니까?

신참 실수가 있으면이 도움이나 제안을 요청할 수 있습니까?

+0

위의 코드를 올바르게 포맷하면 launch = 1이고 버튼 사용 중지가 설정되어 있는지 쉽게 알 수 있습니다. – voiDnyx

답변

1

난 당신이 messagebox 위젯이 할 수있는 모든 방법을 모르는하는 동안 Toplevel으로 messagebox를 대체하여 당신이 가장 확실하게이 작업을 수행 할 수 있습니다 (난 당신이 트리거로 사용할 수있는 이벤트가있을거야하지만) 위젯을 사용하고 위젯에 .protocol("WM_DELETE_WINDOW", callback())을 사용합니다.

Toplevel 위젯이 "닫힐 때"실제로 이벤트가 발생했을 때 수행 한 작업을 덮어 쓰며 위젯의 닫는 작업과 원하는 작업을 수동으로 처리하게됩니다.

이는 아래와 같이 보일 것입니다 :

from tkinter import * 

root = Tk() 

button = Button(root, text="Ok", state="disabled") 
button.pack() 

top = Toplevel(root) 

def close(): 
    top.destroy() 
    button.configure(state="active") 

top.protocol("WM_DELETE_WINDOW", close) 

root.mainloop() 

을 당신이 Toplevel 위젯 버튼이 active 대신 지금 것을 볼 닫으면. 함수 close()을 호출 한 Toplevel 위젯에 Button을 추가하면 똑같이 작동합니다.

+0

정말 고마워요! – wojtas

+0

귀하의 질문에 대한 답변이 있으면 향후 사용자가 검토 할 수 있도록 허용 한 것으로 표시하십시오. –