Python curses 终端屏幕闪烁

11 投票
1 回答
5592 浏览
提问于 2025-04-18 14:49

我正在写一个用Python做的curses游戏(https://github.com/pankshok/xoinvader)。

我遇到了一个问题:在终端模拟器里运行得很好,但在tty屏幕上却闪烁。

我试着用curses.flash(),结果情况更糟。

比如,屏幕字段:

self.screen = curses.newwin(80, 24, 0, 0)

主循环:

def loop(self):
    while True:
        self.events()
        self.update()
        self.render()

渲染方法:(https://github.com/pankshok/xoinvader/blob/master/xoi.py#L175)

self.screen.clear()
#draw some characters    
self.screen.refresh()
time.sleep(0.03)

在sleep函数里的固定时间是暂时的,等我写好60次渲染调用的控制器后会改进。

请问如何正确实现渲染方法?

提前感谢,
保罗。

1 个回答

29

不要用 clear 来清屏,应该用 erase。使用 clear 会设置一个标记,这样当你调用 refresh 时,它首先会清空终端的屏幕。这就是为什么终端的屏幕会出现闪烁的原因。用户会先看到旧的屏幕,然后是一个完全空白的屏幕,最后才是你新的屏幕。如果你用 erase,那么它会直接修改旧的屏幕,让它看起来像新的那样。

在一些比较慢的终端上,你可能还是会看到一些奇怪的闪烁或者其他问题。你可以尝试调用 screen.idcok(False)screen.idlok(False),这样可以阻止 curses 使用插入和删除操作来更新屏幕。

撰写回答