Я разрабатываю автоматизированную систему учета посещаемости, в которой, когда учащийся сканирует свою RFID-метку, его посещаемость записывается при отображении приветственного сообщения с помощью всплывающего окна tkmessagebox. Пользователь не будет контролировать мышь или клавиатуру, и я хотел бы сохранить сообщение в течение 2 секунд и удалить окно сообщения. Есть ли способ закрыть всплывающее окно tkmessagebox, как было предложено?
закрытие tkmessagebox через некоторое время в python
Ответы (3)
Я не думаю, что это можно сделать с помощью tkMessageBox
, потому что это создает модальный диалог, и у вас нет доступа к идентификатору виджета (чтобы его можно было уничтожить программно).
Но нетрудно создать свое собственное окно верхнего уровня, добавить в него приветственное сообщение, а затем закрыть его по истечении определенного периода времени. Что-то вроде этого:
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()
создается виджет верхнего уровня с сообщением. Виджет верхнего уровня уничтожается через 2000 миллисекунд (2 секунды) с использованием .after()
a>, который регистрирует функцию обратного вызова, которая будет вызываться после задержки.
Я перепробовал множество решений, которые нашел в Интернете, но ни одно из них не сработало так, как я ожидал. Наконец, я нашел простое решение:
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
С Python3 вы должны вызвать Toplevel() с именем импорта, например:
import tkinter
top = tkinter.Toplevel()