#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/JZgi9ewb3. @falsetru Отлично!! пожалуйста, вставьте его в качестве ответа, чтобы я мог его принять, и большое спасибо, ребята, за вашу помощь.
Ответ №2:
Функция window.timeout(delay)
, скорее всего, то, что вы ищете. Как только тайм-аут установлен, getch
будет ждать delay
миллисекунды, прежде чем вернуть -1.
Хотя использование time.sleep(seconds)
будет работать, timeout
оно намного чище и обеспечит более плавный пользовательский интерфейс из-за sleep
задержки обработки пользовательского ввода на столько, сколько seconds
.