多文件输出场景下,如何实现Curses窗口持久化且非阻塞?
实现curses窗口持久化且非阻塞的方案
现有代码
main.py
from .terminal import current_instance current_instance.addstr("Hello world!") current_instance.refresh()
terminal.py
import curses current_instance = curses.initscr() curses.noecho() curses.cbreak()
问题描述
运行main.py时,窗口初始化并打印文本后会立刻关闭;在terminal.py中添加循环会导致程序阻塞,在main.py中加循环则不利于其他文件向终端窗口输出内容。尝试调用nodelay()并编写异步函数无限调用getch(),窗口虽能保持持久,但仍存在阻塞问题。
解决方案:用后台线程单独处理输入事件
将curses的输入监听逻辑放到独立的后台线程中,既能维持窗口持久化,又不会阻塞主线程及其他文件的输出操作。
修改后的terminal.py
import curses import threading def keep_window_alive(window): # 开启非阻塞模式 window.nodelay(True) while True: try: # 非阻塞获取输入,无输入时抛出curses.error异常 key = window.getch() if key == ord('q'): # 按q键可主动退出程序 break except curses.error: pass current_instance = curses.initscr() curses.noecho() curses.cbreak() # 启动后台守护线程维持窗口运行 threading.Thread(target=keep_window_alive, args=(current_instance,), daemon=True).start()
方案说明
- 通过
nodelay(True)将getch()设置为非阻塞模式,无输入时抛出的异常被捕获后继续循环,不会阻塞线程。 - 线程设置为
daemon=True,确保主线程退出时后台线程自动终止,避免残留进程。 - 可自定义退出条件(示例为按q键),也能根据需求调整循环逻辑。
- 主线程及其他文件仍可正常调用
current_instance.addstr()和refresh()更新终端内容,不受阻塞影响。
内容的提问来源于stack exchange,提问作者Sokuto
相关产品推荐
相关产品推荐

