Функция в коробке ругается

Там. Может кто-нибудь сказать мне, что я сделал не так в коде? Почему функция таймера не появляется в поле?

import curses
from datetime import datetime

stdsrc= curses.initscr()

SPACE_KEY = ord(' ')

box1 = curses.newwin(20, 30, 10, 10)
box1.box()  
def run(win):

    win.timeout(1000) 
    start = datetime.now()
    while True:
        now = datetime.now()
        minutes, seconds = divmod((now - start).total_seconds(), 60)
        win.addstr(0, 0, "%02d:%02d" % (minutes, round(seconds)))

        c = win.getch() # c variable to get user character
        if c == SPACE_KEY: 
            break

box1.refresh()  

curses.wrapper(run)

curses.endwin()

2 ответа

Решение

Первые два аргумента addstr координаты для начала текста. В своем коде вы начинаете текст с координат 0,0тогда как ваша коробка начинается с координат 20,30,

Таймер не отображается в окне по двум причинам:

  • таймер записывается не в то окно, и

  • окно, которое вы читаете (используя getch) перекрашивает и перезаписывает коробку.

Вот пересмотренный пример, который делает поле подокном winи (кстати) отодвигает таймер от границы поля:

import curses
from datetime import datetime

SPACE_KEY = ord(' ')

def run(win):
    box1 = win.subwin(20, 30, 10, 10)
    box1.box()  

    win.timeout(1000) 
    start = datetime.now()
    while True:
        now = datetime.now()
        minutes, seconds = divmod((now - start).total_seconds(), 60)
        box1.addstr(1, 1, "%02d:%02d" % (minutes, round(seconds)))
        box1.refresh()  

        c = win.getch() # c variable to get user character
        if c == SPACE_KEY: 
            break

stdsrc = curses.initscr()
curses.wrapper(run)

Призыв к initscr не нужно; curses.wrapper делает это Если вы удалите это initscr вызов, экран будет использовать белый на черном. Но правильно подобрать цвета - это другой вопрос.

Другие вопросы по тегам