Python3 Проклятия: как нажать «q» для немедленного завершения программы?

#python #python-3.x #ncurses #curses #python-curses

#python #python-3.x #ncurses #проклятия #python-проклятия

Вопрос:

Когда я запускаю следующий пример кода и нажимаю просто «q», он завершается правильно, но если я нажму любые другие символы «например, много разрывов и много других символов», а затем нажму «q», он не завершится, как я могу это решить?

 import curses, time

def main(sc):
    sc.nodelay(1)

    while True:
        sc.addstr(1, 1, time.strftime("%H:%M:%S"))
        sc.refresh()

        if sc.getch() == ord('q'):
            break

        time.sleep(1)

if __name__=='__main__': curses.wrapper(main)
 

Ответ №1:

Нажатие других клавиш вызывает time.sleep(1) вызов, вы должны подождать n несколько секунд ( n = количество других нажатий клавиш).

Удаление time.sleep вызова решит вашу проблему.

 def main(sc):
    sc.nodelay(1)

    while True:
        sc.addstr(1, 1, time.strftime("%H:%M:%S"))
        sc.refresh()

        if sc.getch() == ord('q'):
            break

        #time.sleep(1) <------
 

Альтернатива: вызов time.sleep условно (только когда ни одна клавиша не была нажата, getch возвращается -1 , если ни одна клавиша не была нажата в неблокирующем режиме):

 while True:
    sc.addstr(1, 1, time.strftime("%H:%M:%S"))
    sc.refresh()

    key = sc.getch()
    if key == ord('q'):
        break
    elif key < 0:
        time.sleep(1)
 

Комментарии:

1. Большое спасибо @falsetru за быстрый ответ, но, как я уже упоминал, это пример кода, мой реальный код — это приложение, похожее на top, с опцией тайм-аута / времени обновления, поэтому я должен использовать sleep внутри кода, чтобы соответствовать определенному тайм-ауту.

2. @M.Adel, как насчет time.sleep условного вызова? (только когда ни одна клавиша не была нажата: sc.getch() возвращает -1 ) pastebin.com/JZgi9ewb

3. @falsetru Отлично!! пожалуйста, вставьте его в качестве ответа, чтобы я мог его принять, и большое спасибо, ребята, за вашу помощь.

Ответ №2:

Функция window.timeout(delay) , скорее всего, то, что вы ищете. Как только тайм-аут установлен, getch будет ждать delay миллисекунды, прежде чем вернуть -1.

Хотя использование time.sleep(seconds) будет работать, timeout оно намного чище и обеспечит более плавный пользовательский интерфейс из-за sleep задержки обработки пользовательского ввода на столько, сколько seconds .