在Python中,如何在一定时间后关闭tkmessagebox?

10

我正在开发一种自动考勤系统,当学生扫描他的RFID标签时,会记录他的出勤情况,并使用tkmessagebox弹出一个欢迎信息。用户将无法控制鼠标或键盘,我希望消息显示2秒钟并删除消息框。是否有一种像所提议的那样关闭tkmessagebox弹出窗口的方法?

4个回答

4

我认为不能使用 tkMessageBox 来实现此功能,因为它会创建一个模态对话框,并且您无法访问小部件 ID(以便可以通过编程方式销毁它)。

但是,创建自己的顶级窗口并为其添加一些欢迎消息,然后在一定时间后关闭它并不难。例如:

from Tkinter import *

WELCOME_MSG = '''Welcome to this event.

Your attendance has been registered.

Don't forget your free lunch.'''
WELCOME_DURATION = 2000

def welcome():
    top = Toplevel()
    top.title('Welcome')
    Message(top, text=WELCOME_MSG, padx=20, pady=20).pack()
    top.after(WELCOME_DURATION, top.destroy)

root = Tk()
Button(root, text="Click to register", command=welcome).pack()

root.mainloop()

你需要连接一个事件处理程序到RFID检测机制中。在上述代码中,这是通过一个按钮模拟的,事件处理程序是welcome()函数。在welcome()函数中,创建了一个带有消息的顶层窗口小部件。通过使用.after()方法注册一个回调函数,在2000毫秒(2秒)后销毁了顶层小部件。


4

我尝试了网上找到的许多解决方案,但都不能满足我的期望。最终,我找到了一个简单的解决方案:

from tkinter import Tk
from tkinter.messagebox import Message 
from _tkinter import TclError

TIME_TO_WAIT = 2000 # in milliseconds 
root = Tk() 
root.withdraw()
try:
    root.after(TIME_TO_WAIT, root.destroy) 
    Message(title="your title", message="your message", master=root).show()
except TclError:
    pass

我知道这并不是最优解,因为我忽略了TclError异常,但这是我找到的唯一能用的方法。 顺便说一下,我正在使用Python 3.7。


当我尝试这个时,它可以工作但是会出现一个错误objc[49016]: autorelease pool page 0x7f818195e000 corrupted magic 0x00000000 0x00000000 0x00000000 0x00000000 should be 0xa1a1a1a1 0x4f545541 0x454c4552 0x21455341 pthread 0x10a55fe00 should be 0x10a55fe00我该如何避免这个错误? - Howard Matis
我尝试获取您的错误,但无法获得它,因此我建议您尝试使用空except代替TclError except。 - Aking

1
下面的小函数可以完成该任务。通过设置类型,您可以选择信息、警告或错误消息框,默认为“信息”。您还可以设置超时时间,默认为2.5秒。
def showMessage(message, type='info', timeout=2500):
    import tkinter as tk
    from tkinter import messagebox as msgb

    root = tk.Tk()
    root.withdraw()
    try:
        root.after(timeout, root.destroy)
        if type == 'info':
            msgb.showinfo('Info', message, master=root)
        elif type == 'warning':
            msgb.showwarning('Warning', message, master=root)
        elif type == 'error':
            msgb.showerror('Error', message, master=root)
    except:
        pass

请按以下方式调用函数: 对于消息类型为“Info”且超时时间为2.5秒的情况:

showMessage('Your message')

或者通过自己的设置,将消息类型设置为“错误”,超时时间为4秒:

showMessage('Your message', type='error', timeout=4000)

0

使用Python3时,您需要使用导入名称调用Toplevel(),例如:

import tkinter

top = tkinter.Toplevel()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接