通过 MessageBox 控制 Tkinter 按钮功能
Tkinter Button Function Control by MessageBox
下面的代码显示了我的部分程序和我面临的问题。
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)
我在这里苦苦挣扎的问题是,每当我 运行 程序一切正常。当显示 window checkbut 时,nxtquest 和标签 answer01 变灰(禁用)。
开始按钮只启用 checkbut 和 answer01 然后被销毁。 (到目前为止,一切都很好)
因此,一旦输入正确,nxtquest 就会启用,如
别的:
nxtquest.config(状态=正常)
但是当我遇到另一个问题时,nxtquest 按钮已经启用,这就是问题所在!
如何才能使按钮仅在显示警告消息框后自动启用?
如果您发现任何菜鸟错误,我能否就此寻求一些帮助和可能的建议?
虽然我不知道您可以使用 messagebox
小部件执行此操作(尽管我确定有一个事件可以用作触发器),但您肯定可以通过替换来执行此操作messagebox
带有 Toplevel
小部件并在小部件上使用 .protocol("WM_DELETE_WINDOW", callback())
。
这意味着每当 Toplevel
小部件是 "closed" 时,我们实际上将覆盖引发事件时采取的操作,并将手动处理小部件的关闭以及其他任何事情我们希望它能做到。
这看起来像下面这样:
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
。如果我们将 Button
添加到调用函数 close()
.
的 Toplevel
小部件,这同样有效
下面的代码显示了我的部分程序和我面临的问题。
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)
我在这里苦苦挣扎的问题是,每当我 运行 程序一切正常。当显示 window checkbut 时,nxtquest 和标签 answer01 变灰(禁用)。 开始按钮只启用 checkbut 和 answer01 然后被销毁。 (到目前为止,一切都很好) 因此,一旦输入正确,nxtquest 就会启用,如 别的: nxtquest.config(状态=正常) 但是当我遇到另一个问题时,nxtquest 按钮已经启用,这就是问题所在!
如何才能使按钮仅在显示警告消息框后自动启用?
如果您发现任何菜鸟错误,我能否就此寻求一些帮助和可能的建议?
虽然我不知道您可以使用 messagebox
小部件执行此操作(尽管我确定有一个事件可以用作触发器),但您肯定可以通过替换来执行此操作messagebox
带有 Toplevel
小部件并在小部件上使用 .protocol("WM_DELETE_WINDOW", callback())
。
这意味着每当 Toplevel
小部件是 "closed" 时,我们实际上将覆盖引发事件时采取的操作,并将手动处理小部件的关闭以及其他任何事情我们希望它能做到。
这看起来像下面这样:
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
。如果我们将 Button
添加到调用函数 close()
.
Toplevel
小部件,这同样有效