You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多文件输出场景下,如何实现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()

方案说明

  1. 通过nodelay(True)将getch()设置为非阻塞模式,无输入时抛出的异常被捕获后继续循环,不会阻塞线程。
  2. 线程设置为daemon=True,确保主线程退出时后台线程自动终止,避免残留进程。
  3. 可自定义退出条件(示例为按q键),也能根据需求调整循环逻辑。
  4. 主线程及其他文件仍可正常调用current_instance.addstr()和refresh()更新终端内容,不受阻塞影响。

内容的提问来源于stack exchange,提问作者Sokuto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:22:32