没有按钮的tkinter消息框

时间:2013-10-17 18:21:20

标签: python tkinter

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

1 个答案:

答案 0 :(得分:3)

这里有两个原因你不想要一个消息框。

首先,消息框的重点是它是带有一些标准化按钮的模态对话框,你不需要那些按钮。

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


第一个问题很容易解决。 tkMessageBox只是tkCommonDialog.Dialog的简单包装器。值得查看the source,看看构建一个能够满足您需求的对话框是多么简单。但tkSimpleDialog.Dialog甚至比tkCommonDialog更简单(因此得名)。例如:

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)

这就是创建没有按钮的模态对话框所需的全部内容。 Dialog Windows以及tkSimpleDialog的来源有更多详情。


第二个问题更容易解决:如果你不想要一个模态对话框,那么你想要的只是一个普通的Toplevel。您可能希望它为transient,因此它保持在主人之上,隐藏它,不会显示在任务栏上等等,您可能想要配置各种其他事情。但基本上,就是这么简单:

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

现在您可以致电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()