Ожидание ввода в течение 1 секунды в Python - PullRequest
1 голос
/ 11 мая 2019

Я пытаюсь сделать приложение для заметок в Python, используя curses.Внизу слева должны быть часы, которые обновляются каждую секунду.

Проблема, с которой я столкнулся, заключается в том, что она либо должна поспать 1 секунду, либо ждать ввода.

Возможно липодождать ввода в течение 1 секунды и продолжить, если вход не зарегистрирован?

Причина, по которой я хочу это сделать, состоит в том, чтобы предотвратить задержку при перемещении в приложении.

Я думал что-то вродеМногопоточность могла бы справиться с этой задачей, но у нее тоже возникли некоторые проблемы.

Это код, который у меня есть:

#!/usr/bin/env python3
import curses
import os
import time
import datetime
import threading


def updateclock(stdscr):
    while True:
        height, width = stdscr.getmaxyx()
        statusbarstr = datetime.datetime.now().strftime(' %A')[:4] + datetime.datetime.now().strftime(' %Y-%m-%d | %H:%M:%S')
        stdscr.addstr(height-1, 0, statusbarstr)

        time.sleep(1)

def draw_menu(stdscr):
    k = 0

    stdscr.clear()
    stdscr.refresh()

    threading.Thread(target=updateclock, args=stdscr).start()

    cursor_y = 0
    cursor_x = 0

    while (k != ord('q')):
    #while True:

        stdscr.clear()
        height, width = stdscr.getmaxyx()

        stdscr.addstr(height//2, width//2, "Some text in the middle")

        if k == curses.KEY_DOWN:
            cursor_y = cursor_y + 1
        elif k == curses.KEY_UP:
            cursor_y = cursor_y - 1
        elif k == curses.KEY_RIGHT:
            cursor_x = cursor_x + 1
        elif k == curses.KEY_LEFT:
            cursor_x = cursor_x - 1

        stdscr.refresh()
        #time.sleep(1)

        # Wait for next input
        k = stdscr.getch()


curses.wrapper(draw_menu)

Код выглядит довольно грязно, и это первый разВ основном я сосредоточился на функции curses.

Можно ли только ждать ввода k = stdscr.getch() в течение 1 секунды?

1 Ответ

1 голос
/ 11 мая 2019

По умолчанию getch будет блокироваться, пока у вас не будет готов ввод символов.Если режим nodelay установлен в True, вы либо получите значение символа (0-255) готового символа, либо вы получите -1, указывающий, что значение символа не готово.

stdscr.nodelay(True) #Set nodelay to be True, it won't block anymore
k = stdscr.getch() #Either the next character of input, or -1
...