如何在Python中使用Tkinter在更改消息和更改按钮状态的情况下创建自定义消息框


问题内容

我想确定一个消息窗口,在root window此窗口的顶部与该链接类似。一个带有消息和一个无效按钮的消息窗口,直到代码的某些部分完成,然后显示带有一个激活按钮的消息。这就是代码结构的样子(我已经详细说明了一些细节,只是澄清了代码流的样子)

第二个窗口不起作用,而是该窗口出现在功能的末尾。有人可以帮忙吗?

from Tkinter import *
import tkMessageBox

def a():
    return

def b():
    . . .
    . . .
    msg_window = Toplevel()
    msg_window.grapset()
    msg_window.title( ___ )
    msg_geometry( ___ )
    msgLabel = Label(window)
    msgLabel["text"]="Processing...."
    msgLabel.pack()
    btn = Button(msg_window, text="Ok", command=msg_window.destroy())
    btn.pack()
    btn.config(state=DISABLED)
    a()
    c()
    d()
    d()
    msgLabel["text"]="Done"
    msgLabel.pack()
    btn = Button(msg_window, text="Ok", command=msg_window.destroy())
    btn.pack()
    btn.config(state=NORMAL)
    e()
    if tkMessageBox.askyesno( ___ ):
        do something
    else:
        do something
    pass

def c():
    return

def d():
    return

def e():
    return

root = Tk()
frame = Frame( ___ )
frame.pack()
but_find = Button( ___ )
but_find.pack()
but_start = Button( ___ )
but_start.pack()
but_exit = Button( ___ )
but_exit.pack()
root.mainloop()

说明: 我正在构建一个应用程序,其中根窗口包含3个按钮。当start单击按钮时,会function b被调用,这又会调用其内部的各种其他功能function b。这是我要创建第二个窗口的地方,该窗口显示在根窗口上方,并使根窗口处于非活动状态,直到function b完成或被second window破坏为止。

我想要的是.. 第二个窗口(包含2件事-一条消息和一个按钮)应function b在某些步骤后开始。它应该显示该消息,Processing....并在开始之前被inactive button调用Okfunction a并且应该显示直到function d完成。然后,我要显示Done一个active 'Ok' button会破坏第二个窗口的显示。然后root激活窗口。


问题答案:

尝试开发自己的对话框。例:

import Tkinter as tk


class CustomDialog(tk.Toplevel):
    def __init__(self, title, message, command1=self.ok, command2=self.ok, command3=self.ok, buttontext1="button1", buttontext2="button2", buttontext3="button3"):
        self.base = tk.Toplevel()
        self.base.title(title)
        self.label = tk.Label(self.base, text=message)
        self.label.pack()
        self.label.grid(row=0, column=0, columnspan=3, sticky=N)
        self.button1 = tk.Button(self.base, text=buttontext1, command=command1)
        self.button1.pack()
        self.button1.grid(row=1, column=0, sticky=N)
        self.button2 = tk.Button(self.base, text=buttontext2, command=command2)
        self.button2.pack()
        self.button2.grid(row=1, column=1, sticky=N)
        self.button3 = tk.Button(self.base, text=buttontext3, command=command3)
        self.button3.pack()
        self.button3.grid(row=1, column=2, sticky=N)
    def ok(self, event=None):
        self.destroy()
    def baseconfig(self, option, value):
        self.base[option] = value
    def labelconfig(self, option, value):
        self.label[option] = value
    def buttonconfig(self, number, option, value):
        exec "self.button%s[option] = value" % str(number)

def customDialog(title, message, command1=self.ok, command2=self.ok, command3=self.ok, buttontext1="button1", buttontext2="button2", buttontext3="button3", button1ret=None, button2ret=None, button3ret=None):
    def _button1press():
        command1()
        return button1ret
    def _button2press():
        command2()
        return button2ret
    def _button3press():
        command3()
        return button3ret
    dialog = CustomDialog(title, message, _button1press, _button2press, _button3press, buttontext1, buttontext2, buttontext3)

要禁用第一个按钮,请调用self.buttonconfig(1, state, DISABLED)(1表示按钮的编号)。要启用它,请使用self.buttonconfig(1, state, NORMAL)