закрытие tkmessagebox через некоторое время в python

Я разрабатываю автоматизированную систему учета посещаемости, в которой, когда учащийся сканирует свою RFID-метку, его посещаемость записывается при отображении приветственного сообщения с помощью всплывающего окна tkmessagebox. Пользователь не будет контролировать мышь или клавиатуру, и я хотел бы сохранить сообщение в течение 2 секунд и удалить окно сообщения. Есть ли способ закрыть всплывающее окно tkmessagebox, как было предложено?


person Sean Vella    schedule 14.05.2015    source источник


Ответы (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(), который регистрирует функцию обратного вызова, которая будет вызываться после задержки.

person mhawke    schedule 14.05.2015

Я перепробовал множество решений, которые нашел в Интернете, но ни одно из них не сработало так, как я ожидал. Наконец, я нашел простое решение:

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

person Aking    schedule 18.10.2020

С Python3 вы должны вызвать Toplevel() с именем импорта, например:

import tkinter

top = tkinter.Toplevel()
person Mujeeb Ishaque    schedule 10.11.2018