没有按钮的 tkinter 消息框

0 python tkinter

在我的程序中,我只需要通知用户不要在没有键盘或鼠标的系统上按下物理按钮,想要弹出等待消息,当系统再次准备好时消失

aba*_*ert 5

您不想要消息框的原因有两个。

首先,消息框的全部意义在于它是一个带有一些标准化按钮的模式对话框,而您不需要这些按钮。

其次,模态对话框的全部意义在于它是模态的——它运行自己的事件循环,并且在对话框被解除之前不会返回。这意味着(除非您使用后台线程)您的应用程序在显示时无法执行任何操作。


第一个问题很容易解决。tkMessageBox只是一个简单的包装tkCommonDialog.Dialog。值得查看源代码以了解构建一个可以执行所需操作的对话框是多么简单。但tkSimpleDialog.DialogtkCommonDialog(因此得名)更简单。例如:

class WaitDialog(tkSimpleDialog.Dialog):
    def __init__(self, parent, title, message):
        self.message = message
        Dialog.__init__(self, parent, title=title, message=message)
    def body(self, master):
        Label(self, text=self.message).pack()
    def buttonbox(self):
        pass

def wait(message):
    WaitDialog(root, title='Wait', message=message)
Run Code Online (Sandbox Code Playgroud)

这就是创建一个没有按钮的模态对话框所需的全部内容。Dialog Windows和 sourcetkSimpleDialog有更多细节。


第二个问题更容易解决:如果您不想要模态对话框,那么您想要的只是一个普通的旧Toplevel. 您可能希望它是transient,因此它会停留在母版之上,与它一起隐藏,不显示在任务栏上等,并且您可能希望配置各种其他内容。但基本上,就是这么简单:

def wait(message):
    win = Toplevel(root)
    win.transient()
    win.title('Wait')
    Label(win, text=message).pack()
    return win
Run Code Online (Sandbox Code Playgroud)

现在您可以调用wait()并继续运行:

def wait_a_sec():
    win = wait('Just one second...')
    root.after(1000, win.destroy)

root = Tk()
button = Button(root, text='do something', command=wait_a_sec)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)