Python curses addstr () печатает пустые строки только при печати нескольких переменных - PullRequest
0 голосов
/ 17 января 2020

Короче говоря, мой Python скрипт читает последовательные данные из Arduino, обновляет список, затем печатает этот список на экране с проклятиями.

import curses
from curses import wrapper
import serial
import time

knownIds = {}
readyPrint = True

def updateData(packetData):
    newId = packetData[0]
    newLength = packetData[1]
    newData = packetData[2]

    if (newId in knownIds):
        knownIdData = knownIds[newId]
        knownIds[newId] = {'time': time.time(), 'count': knownIdData['count'] + 1, 'value': newData, 'newVal': knownIdData['value'] != newData}
    else:
        knownIds[newId] = {'time': time.time(), 'count': 1, 'value': newData, 'newVal': True}

def printData(stdscr):
    global readyPrint

    stdscr.addstr(0,0, 'ID COUNT: {0}'.format(len(knownIds)), curses.A_BOLD)
    stdscr.addstr(1,0, '-', curses.A_BOLD)
    lineCount = 2
    for id in knownIds:
        if (not knownIds[id]['newVal']):
            stdscr.addstr(lineCount,0, '{0} {1} {2}'.format(id, knownIds[id]['count'], knownIds[id]['value']))
            lineCount = lineCount + 1
    stdscr.refresh()
    readyPrint = True

def main(stdscr):
    global readyPrint

    #curses.curs_set(False)
    stdscr.clear()

    ser = serial.Serial('/dev/cu.usbmodem14201', 115200, timeout=1)
    while True:
        if (ser.readline()):
            packet = ser.readline()
            try:
                packet = packet.decode('utf-8')
                packetData = packet.split(',')
            except:
                return

            if (len(packetData) == 3):
                updateData(packetData)

                if (readyPrint):
                    readyPrint = False
                    printData(stdscr)

wrapper(main)

Обе начальные строки печатаются совершенно нормально:

stdscr.addstr(0,0, 'ID COUNT: {0}'.format(len(knownIds)), curses.A_BOLD)
stdscr.addstr(1,0, '-', curses.A_BOLD)

Проблема возникает во время l oop:

for id in knownIds:
    if (not knownIds[id]['newVal']):
        stdscr.addstr(lineCount,0, '{0} {1} {2}'.format(id, knownIds[id]['count'], knownIds[id]['value']))
        lineCount = lineCount + 1

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

stdscr.addstr(lineCount,0, '{0}'.format(knownIds[id]['count']))

ИЛИ

stdscr.addstr(lineCount,0, str(knownIds[id]['count']))

Я просто не могу получить ничего, кроме пустых строк для печати, когда я печатаю сразу все переменные , Курсор просто прыгает вверх и вниз по окну, когда элементы добавляются и удаляются, но никогда не отображаются. При использовании функции Python print () линии печатаются полностью нормально.

Предполагаемый результат будет выглядеть примерно так:

A3D 10 80 00 00 00

...