我正在开发一种自动考勤系统,当学生扫描他的RFID标签时,会记录他的出勤情况,并使用tkmessagebox弹出一个欢迎信息。用户将无法控制鼠标或键盘,我希望消息显示2秒钟并删除消息框。是否有一种像所提议的那样关闭tkmessagebox弹出窗口的方法?
我正在开发一种自动考勤系统,当学生扫描他的RFID标签时,会记录他的出勤情况,并使用tkmessagebox弹出一个欢迎信息。用户将无法控制鼠标或键盘,我希望消息显示2秒钟并删除消息框。是否有一种像所提议的那样关闭tkmessagebox弹出窗口的方法?
我认为不能使用 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秒)后销毁了顶层小部件。
我尝试了网上找到的许多解决方案,但都不能满足我的期望。最终,我找到了一个简单的解决方案:
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。
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)
使用Python3时,您需要使用导入名称调用Toplevel(),例如:
import tkinter
top = tkinter.Toplevel()