【问题标题】:Tkinter Button Function Control by MessageBox通过 MessageBox 控制 Tkinter 按钮功能
【发布时间】:2017-10-23 14:14:33
【问题描述】:

下面的代码显示了我的程序的一部分以及我面临的问题。

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 和标签 answer01 显示为灰色(禁用)。 开始按钮仅启用 checkbut 和 answer01 然后被销毁。 (到现在为止还挺好) 因此,一旦输入正确,nxtquest 将启用,如 别的: nxtquest.config(状态=正常) 但是当我遇到另一个问题时,nxtquest 按钮已经启用,这就是问题所在!

我怎样才能使按钮仅在显示警告消息框后才启用?

如果您发现任何新手错误,我可以寻求一些帮助吗?

【问题讨论】:

  • 请正确格式化上面的代码,以便更容易看到launch = 1和按钮禁用设置的位置。

标签: python function button tkinter tk


【解决方案1】:

虽然我不知道您可以使用 messagebox 小部件执行此操作的任何方法(尽管我确信您可以将某个事件用作触发器),但您当然可以通过替换 messagebox 来做到这一点使用 Toplevel 小部件并在小部件上使用 .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。如果我们将Button 添加到调用函数close()Toplevel 小部件,这同样有效。

【讨论】:

  • 非常感谢!
  • 如果这回答了您的问题,请您将其标记为已接受以供未来用户查看。
猜你喜欢
  • 1970-01-01
  • 2019-03-22
  • 2021-08-03
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多