Функция в коробке ругается
Там. Может кто-нибудь сказать мне, что я сделал не так в коде? Почему функция таймера не появляется в поле?
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
вызов, экран будет использовать белый на черном. Но правильно подобрать цвета - это другой вопрос.