更新多个NCurses Windows

时间:2015-07-25 07:08:36

标签: python ncurses

我提前为一个复杂的问题道歉。

我正在使用NCurses和Python 3制作终端仪表板。此仪表板包含两部分:日志记录部分和字典显示部分

enter image description here

初始化代码如下所示:

panel = None
window = None
screen = None

def setup_terminal_logging():
    global panel
    global screen
    global window
    screen = curses.initscr()
    screen.nodelay(1)
    screen.border(0)

    maxy, maxx = screen.getmaxyx()

    height = 20
    # height, width, begin_y, begin_x
    window = curses.newwin(height, maxx-4, maxy-(height + 1), 2)

    panel = curses.newwin(25, maxx-4, 2, 2)
    panel.refresh()

    curses.setsyx(-1, -1)

    screen.refresh()
    window.refresh()
    window.scrollok(True)
    window.idlok(True)
    window.leaveok(True)

    terminal_handler = modules.log.CursesHandler(window)
    logger.addHandler(terminal_handler)

CursesHandler与日志记录联系并向控制台显示输出(屏幕底部)。它看起来像这样:

class CursesHandler(logging.Handler):
    def __init__(self, screen):
        logging.Handler.__init__(self)
        self.screen = screen

        curses.start_color()
        curses.use_default_colors()
        for i in range(0, curses.COLORS):
            curses.init_pair(i + 1, i, -1)

    def emit(self, record):
        msg = self.format(record)
        screen = self.screen
        ufs = u'\n%s'
        screen.addstr(ufs % msg, 83)
        screen.refresh()

顶部的部分通过在函数中传递两个字典并使用全局范围的windowpanel变量来更新:

def update_terminal_display(data, values):
    global panel
    for k, j in enumerate([data, values]):
        for index, (key, value) in enumerate(j.items()):
            if "_locations" in key:
                continue
            logger.debug("-")
            panel.addstr(index + 2, 2 + (k * 50), str(key) + ": " + str(value))
        panel.refresh()

虽然我遇到了一些奇怪的行为,但似乎一切都很好。

如果我删除logger.debug("-")方法中的update_terminal_display语句,则显示会打印出乱码:

enter image description here

奇怪的是,字面上仅删除此语句会导致此行为,尤其是当顶部面板与底部面板分开时。

更奇怪的是,我将logger.debug("-")替换为window.refresh()(实际上它正在调用它),但它仍然不起作用。如何防止此行为发生?是什么导致他们发生冲突?我可以在一个窗口上调用refresh()而不会干扰另一个窗口吗?

非常感谢您提供的任何帮助!

0 个答案:

没有答案