Как я могу сделать строку, которая обновляется потоком, отражает изменения в проклятиях Python? - PullRequest
0 голосов
/ 03 января 2019

Я планирую внедрить библиотеку curses в существующий скрипт Python для клиента.Сценарий будет запускаться исключительно через SSH.

В настоящее время я пытаюсь смоделировать некоторые выходные данные, которые сгенерирует мой сценарий.

В моем сценарии «тестирования на воде» у меня 3переменные: x, y, z.

У меня есть поток, работающий вдоль цикла curses, который увеличивает x, y и z каждые x секунд.В цикле я просто печатаю три переменные на экране терминала.

Проблема : Переменные не обновляются, пока я не предоставлю какой-либо ввод. Как я могу заставить строку терминала автоматически обновлять значения?

Я проверяю это на Терминале в Kubuntu.Я попробовал Urwid и столкнулся с подобной проблемой.

import curses
import time
from threading import Thread

x, y, z = 0, 0, 0
go = True


def increment_ints():
    global x, y, z
    while go:
        x += 1
        y += 2
        z += 3
        time.sleep(3)


def main(screen):
    global go
    curses.initscr()
    screen.clear()
    while go:
        screen.addstr(0, 0, f"x: {x}, y = {y}, z = {z}")
        c = screen.getch()
        if c == ord('q'):
            go = False


if __name__ == '__main__':
    t = Thread(target=update_ints)
    t.setDaemon(True)
    t.start()
    curses.wrapper(main)

Ожидается : значения x, y и z отображаются и отражают приращения без ввода.

Фактические результаты : значения x, y и z остаются 1, 2 и 3 соответственно и обновляются только при нажатии клавиши.

----------- Редактировать: Это работает, как и ожидалось:

import curses
import time
from threading import Thread

x, y, z = 0, 0, 0
go = True
def update_ints():
    global x, y, z
    x += 1
    y += 2
    z += 3


def main(screen):
    global go
    curses.initscr()
    screen.clear()
    while go:
        update_ints()
        screen.addstr(0, 0, f"x: {x}, y = {y}, z = {z}")
        c = screen.getch()
        if c == ord('q'):
            go = False
        time.sleep(3)


if __name__ == '__main__':
    curses.wrapper(main)

Но мне понадобится обновить значения из потока.

1 Ответ

0 голосов
/ 03 января 2019

Проблема заключалась в том, что c = screen.getch() блокировал цикл и препятствовал обновлению значений.

Удаление ...

c = screen.getch()
if c == ord('q'):
   go = False

... дало ожидаемые результаты.

Спасибо NEGR KITAEC

...