Python 不带按钮的tkinter messagebox

Python 不带按钮的tkinter messagebox,python,tkinter,Python,Tkinter,在我的程序中,我只需要通知用户不要在没有键盘或鼠标的系统中按下物理按钮, 要弹出等待消息,当系统再次准备就绪时,该消息将消失。有两个原因使您不希望在此处显示消息框 首先,消息框的全部意义在于它是一个带有一些标准化按钮的模式对话框,而您不需要这些按钮 第二,模态对话框的全部要点是它是模态的,它运行自己的事件循环,直到对话框被关闭才返回。这意味着(除非您使用后台线程),您的应用程序在显示时无法执行任何操作 第一个问题很容易解决tkMessageBox只是tkCommonDialog.Dialog的

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

有两个原因使您不希望在此处显示消息框

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

第二,模态对话框的全部要点是它是模态的,它运行自己的事件循环,直到对话框被关闭才返回。这意味着(除非您使用后台线程),您的应用程序在显示时无法执行任何操作


第一个问题很容易解决
tkMessageBox
只是
tkCommonDialog.Dialog
的一个简单包装器。值得一看的是,构建一个能够满足您需求的对话框是多么简单。但是
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)
这就是创建一个没有按钮的模态对话框所需要的全部。和来源有更多的细节


第二个问题更容易解决:如果你不想要一个模态对话框,那么你只需要一个普通的旧
顶级
。您可能希望它是这样的,因此它位于主控面板的顶部,隐藏在主控面板上,不显示在任务栏上,等等,并且您可能需要配置各种其他内容。但基本上是这么简单的:

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()

有两个原因使您不希望在此处设置消息框

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

第二,模态对话框的全部要点是它是模态的,它运行自己的事件循环,直到对话框被关闭才返回。这意味着(除非您使用后台线程),您的应用程序在显示时无法执行任何操作


第一个问题很容易解决
tkMessageBox
只是
tkCommonDialog.Dialog
的一个简单包装器。值得一看的是,构建一个能够满足您需求的对话框是多么简单。但是
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)
这就是创建一个没有按钮的模态对话框所需要的全部。和来源有更多的细节


第二个问题更容易解决:如果你不想要一个模态对话框,那么你只需要一个普通的旧
顶级
。您可能希望它是这样的,因此它位于主控面板的顶部,隐藏在主控面板上,不显示在任务栏上,等等,并且您可能需要配置各种其他内容。但基本上是这么简单的:

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()

请提供与您的问题相关的更多详细信息,例如您的实际代码以及为什么它不能像您预期的那样工作。这使您更容易理解问题并为您提供帮助。
tkMessageBox
只是一个添加了一些标准按钮的
对话框。因此,与其试图找出如何绕过消息框以避免按钮,为什么不直接使用
对话框
?请提供与您的问题相关的更多详细信息,例如您的实际代码以及为什么它不能按预期工作。这使您更容易理解问题并为您提供帮助。
tkMessageBox
只是一个添加了一些标准按钮的
对话框。因此,与其试图找出如何绕过消息框以避免按钮,为什么不直接使用
对话框
?这几乎适用于我。。我正在使用您的等待功能,但直接将其命名为win=Wait(“仅一秒”),但直到它所在的函数完成,然后当它显示在我的根窗口下方且没有文本时,它才显示出来,并且win.destroy引发了一个错误“NoneType”对象没有属性“destroy”@Blanius:我必须查看您编写的代码才能调试它。但听起来好像你想在按钮命令的中间做一些缓慢和阻塞的事情。在基于事件循环的应用程序(如典型的GUI)中,你永远无法做到这一点;如果不快速返回,事件循环就不会运行,整个GUI都会冻结。这对我来说几乎是可行的。。我正在使用您的等待功能,但直接将其命名为win=Wait(“仅一秒”),但直到它所在的函数完成,然后当它显示在我的根窗口下方且没有文本时,它才显示出来,并且win.destroy引发了一个错误“NoneType”对象没有属性“destroy”@Blanius:我必须查看您编写的代码才能调试它。但听起来好像你想在按钮命令的中间做一些缓慢和阻塞的事情。在基于事件循环的应用程序(如典型的GUI)中,你永远无法做到这一点;如果不快速返回,事件循环将不会运行,整个GUI将冻结。