I am developing an automated attendance system where when a student scans his RFID tag, his attendance is recorded while showing a welcoming message using a tkmessagebox pop-up. The user will not have control of a mouse or keyboard and I would like to keep the message showing for 2 seconds and delete the message box. Is there a way I can close the tkmessagebox pop-up like proposed?
I have tried many solutions I have found online, none worked as I would have expected. Finally, I have found an easy solution:
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
I know it's not optimal because I ignored the TclError, but it's the only thing that worked for me. BTW I'm working with python 3.7
I don't think that it can be done with tkMessageBox
because this creates a modal dialog, and you do not have access to the widget id (so that it can be programmatically destroyed).
But it's not hard to create your own top level window, add some welcome message to it, then close it after a time period. Something like this:
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()
You need to hook up an event handler to the RFID detection. This is simulated by a button in the above code, and the event handler is the welcome()
function. In welcome()
a top level widget with a message is created. The top level widget is destroyed after 2000 milliseconds (2 seconds) using .after()
which registers a callback function to be called after a delay.
The small function below will do the job. By setting the type you can choose for: info, warning or error message box, the default is 'Info'. You can set also the timeout, the default is 2.5 seconds.
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
Call the function as follow: For message type 'Info' and timeout of 2.5 seconds:
showMessage('Your message')
Or by your own settings for type message 'Error' and timeout 4 seconds:
showMessage('Your message', type='error', timeout=4000)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With