Python — отображение окна сообщения, которое можно закрыть в коде (без вмешательства пользователя)

Я создаю тестовые сценарии с использованием Python. Мне нужно, чтобы сообщение отображалось для пользователя, пока скрипт продолжает работать. Это должно иметь некоторое обновление статуса, например: «Сохранение результатов теста», которое не должно ждать, пока пользователь нажмет «ОК». По сути, мне нужно создать сообщение, которое появляется и закрывается без участия пользователя.

В настоящее время я использую модуль easygui для добавления GUI. Easygui можно использовать для создания таких окон сообщений, но они не могут быть закрыты в коде и должны ждать, пока пользователь закроет их, чтобы скрипт продолжил работу.

Заранее спасибо за ваше время и помощь.

Кавита


person user1145494    schedule 12.01.2012    source источник


Ответы (2)


Чтобы принудительно удалить по тайм-ауту окно сообщения, созданное с помощью easygui, вы можете использовать метод .after():

from Tkinter    import Tk
from contextlib import contextmanager

@contextmanager
def tk(timeout=5):
    root = Tk() # default root
    root.withdraw() # remove from the screen

    # destroy all widgets in `timeout` seconds
    func_id = root.after(int(1000*timeout), root.quit)
    try:
        yield root
    finally: # cleanup
        root.after_cancel(func_id) # cancel callback
        root.destroy()

Пример

import easygui

with tk(timeout=1.5):
    easygui.msgbox('message') # it blocks for at most `timeout` seconds

easygui не очень подходит для вашего варианта использования. Рассмотрим unittestgui.py или Дженкинс.

person jfs    schedule 12.01.2012
comment
@ user1145494: вы пропустили @contextmanager строку. from Tkinter import * не имеет ничего общего с ошибкой; не используйте импорт с подстановочными знаками; в этом случае используется только имя Tk из модуля Tkinter. - person jfs; 16.01.2012
comment
Предыдущий комментарий, который я оставил, был неполным, поэтому я его удалил. В приведенном выше коде в строке с tk(timeout=1.5) я получил следующую ошибку: AttributeError: объект 'generator' не имеет атрибута 'exit'. Однако я нашел то, что искал, в заголовке stackoverflow.com/questions/1917198/. (первый пример кода). Большое спасибо за ваше время и усилия. - person user1145494; 16.01.2012

Если вы начали создавать графический интерфейс, вы сможете использовать функцию textbox(). Текстовое поле можно использовать как место для ваших сообщений о состоянии, а не создавать отдельное диалоговое окно.

Я получил следующее описание textbox() здесь:

текстовое поле (msg = '', title = ' ', текст = '', кодовое поле = 0)

Отображать текст пропорциональным шрифтом с переносом строки на разрывы слов. Эта функция подходит для отображения обычного письменного текста. Текстовый параметр должен быть строкой, списком или кортежем строк, которые будут отображаться в текстовом поле.

person gary    schedule 12.01.2012
comment
textbox(), как и любые другие easygui функциональные блоки навсегда. - person jfs; 13.01.2012
comment
Я не уверен, что вы подразумеваете под блоками навсегда. Означает ли это, что его содержимое нельзя обновить? - person gary; 13.01.2012