在我的程序中,我只需要通知用户不要按下没有键盘或鼠标的系统的物理按钮, 想要弹出等待消息,该消息在系统再次准备就绪时消失
答案 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()