Curses中新增窗口内的文本无法显示,如何解决?
解决Curses窗口中文本无法显示的问题
我仔细看了你的代码,问题出在窗口刷新的顺序和重复刷新上!
你在add_window_and_str方法里,先调用了win.refresh()绘制窗口内容,紧接着又调用self.stdscr.refresh()——这会导致标准屏幕(父窗口)重新绘制,直接把刚显示的子窗口内容给覆盖掉了。Curses的刷新机制是父窗口的刷新会覆盖所有子窗口的内容,除非你调整刷新顺序或者避免不必要的父窗口刷新。
两种快速解决方法:
方法1:移除子窗口方法中的父窗口刷新
直接删掉add_window_and_str里的self.stdscr.refresh()即可,因为子窗口的refresh()已经会把内容绘制到屏幕上,不需要再刷新父窗口:
class View: def __init__(self): self.stdscr = curses.initscr() curses.noecho() curses.cbreak() self.stdscr.keypad(True) # ----------------- self.add_window_and_str() self.add_str() # ----------------- self.stdscr.getkey() curses.endwin() def add_str(self): # just text in standard screen self.stdscr.addstr("test") self.stdscr.refresh() def add_window_and_str(self): scr_limits = self.stdscr.getmaxyx() win = curses.newwin(scr_limits[0] - 10, scr_limits[1] - 10, 5, 5) win.addstr("Example String") # 只刷新子窗口,无需刷新父窗口 win.refresh() # 移除这一行:self.stdscr.refresh()
方法2:调整刷新顺序(更规范的做法)
如果确实需要刷新父窗口,一定要先刷新父窗口,再刷新子窗口,这样子窗口的内容会覆盖在父窗口之上:
def add_window_and_str(self): scr_limits = self.stdscr.getmaxyx() win = curses.newwin(scr_limits[0] - 10, scr_limits[1] - 10, 5, 5) win.addstr("Example String") # 先刷新父窗口,再刷新子窗口 self.stdscr.refresh() win.refresh()
额外优化:批量刷新(推荐)
如果有多个窗口需要刷新,更高效的方式是用noutrefresh()(只更新缓冲区不显示),最后调用curses.doupdate()一次性把所有缓冲区内容绘制到屏幕,避免重复覆盖:
class View: def __init__(self): self.stdscr = curses.initscr() curses.noecho() curses.cbreak() self.stdscr.keypad(True) # ----------------- self.win = self.add_window_and_str() self.add_str() # 批量刷新缓冲区 self.stdscr.noutrefresh() self.win.noutrefresh() curses.doupdate() # ----------------- self.stdscr.getkey() curses.endwin() def add_str(self): self.stdscr.addstr("test") def add_window_and_str(self): scr_limits = self.stdscr.getmaxyx() win = curses.newwin(scr_limits[0] - 10, scr_limits[1] - 10, 5, 5) win.addstr("Example String") return win
这样修改后,你的窗口文本就能正常显示啦!
内容的提问来源于stack exchange,提问作者user5308730
相关产品推荐
相关产品推荐

