0

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

4

1 回答 1

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)

这就是创建没有按钮的模式对话框所需的全部内容。对话框窗口和源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()
于 2013-10-17T19:09:28.207 回答