我提前为一个复杂的问题道歉。
我正在使用NCurses和Python 3制作终端仪表板。此仪表板包含两部分:日志记录部分和字典显示部分
初始化代码如下所示:
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()
顶部的部分通过在函数中传递两个字典并使用全局范围的window
和panel
变量来更新:
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
语句,则显示会打印出乱码:
奇怪的是,字面上仅删除此语句会导致此行为,尤其是当顶部面板与底部面板分开时。
更奇怪的是,我将logger.debug("-")
替换为window.refresh()
(实际上它正在调用它),但它仍然不起作用。如何防止此行为发生?是什么导致他们发生冲突?我可以在一个窗口上调用refresh()
而不会干扰另一个窗口吗?
非常感谢您提供的任何帮助!