печатать одни и те же проклятия несколько раз - python

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

Я пишу эту небольшую версию, которая резюмирует мою проблему:

import time
import curses

def draw_menu(stdscr):
    global data
    # Turn cursor off
    curses.curs_set(False)

    # Rendering text
    stdscr.addstr(2, 5, "Help me please")
    stdscr.addstr(5, 5, data)
    # Refresh the screen
    stdscr.refresh()
    time.sleep(3)

data = 'some initial value'
for i in xrange(2):
    curses.wrapper(draw_menu)
    # Do some stuff to update values shown in the menu
    data = 'updated value {}'.format(i)
    time.sleep(3)

После первоначального вызова draw_menu мне нужно обновить значения, отображаемые в меню. Во время обновления (в этом примере я использовал time.sleep) значения удаляются из окна, и оно возвращается в «обычный режим терминала», я не знаю, почему.

Я хотел бы обновить данные, оставаясь все время с этим сообщением «помогите мне, пожалуйста», и отображаемыми данными.

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

Как я могу это решить?


person Rodrigo Laguna    schedule 26.06.2017    source источник


Ответы (1)


В вашем примере цикл должен быть внутри вызова curses.wrapper, например, что-то вроде

import curses

def draw_menu(stdscr):
    global data
    # Turn cursor off
    curses.curs_set(False)

    # Rendering text
    stdscr.addstr(2, 5, "Help me please")
    stdscr.addstr(5, 5, data)
    # Refresh the screen
    stdscr.refresh()
    curses.napms(3000)

def draw_menu_loop(w):
    global data
    data = 'some initial value'
    for i in xrange(2):
        draw_menu(w)
        # Do some stuff to update values shown in the menu
        data = 'updated value {}'.format(i)
    curses.napms(3000)

curses.wrapper(draw_menu_loop)

Кстати (на самом деле должен быть новый вопрос), в вашем примере использовалось time.sleep, что мешает своевременному обновлению экрана. Используйте curses.napms, у которого нет этого недостатка.

person Thomas Dickey    schedule 26.06.2017
comment
Итак, я должен сделать своего рода оболочку всего моего кода (назовем его main()), а затем выполнить curses.wrapper(main)? нет способа заморозить экран, чтобы он не вернулся в «обычный режим терминала»? - person Rodrigo Laguna; 26.06.2017
comment
Это не работает. draw_menu_loop без() выдает SyntaxError, а добавление() приводит к тому, что draw_menu_loop() не принимает аргументов (дан 1). Я также пробовал писать draw_menu_loop(foo), и он запускается, но показывает только экран без текста. - person Rodrigo Laguna; 28.06.2017