Python文字游戏:逐字输出文本时按回车立即显示剩余内容
核心问题根源
你原来的代码跑不动想要的效果,根本原因是两个:
- 逐字打印的循环里硬卡着
sleep(0.01),整个程序从进入循环开始就完全阻塞,根本腾不出精力去监听用户按没按回车,等所有字都打完了才轮到去读输入,自然做不到打印过程中随时快进 - 交互提示是等整段文本逐字输出完才弹出来,用户在阅读逐字滚动文本的阶段根本看不到提示,完全不知道可以按回车跳读
实现方案
- 直接用多线程拆流程:一个线程专门负责挨个输出字符打文本,另一个后台线程全程监听用户的回车输入,两个流程并行跑,谁也不挡谁
- 把交互提示直接拼在每段剧情文本的末尾,逐字打印一开始滚动,用户就能在屏幕上看到
[Press enter to continue],根本不用等文本全出来 - 加个全局状态标记:后台线程一旦检测到用户按了回车,就把标记设成触发状态;逐字打印的循环每打一个字符就检查一次标记,要是触发了,直接跳出循环,把这一段剩下的所有没打的字一次性全输出,直接推进到下一个交互环节
改完可以直接跑的代码
import time import sys import threading # 全局快进触发标记 skip_typing = False def listen_enter_input(): """后台线程:持续监听回车输入""" global skip_typing while True: input() skip_typing = True # 启动后台监听线程,设为守护线程,主程序退出时自动结束,不会卡进程 threading.Thread(target=listen_enter_input, daemon=True).start() def type_print(text): """逐字打印文本,支持回车快进,避免覆盖内置print方法""" global skip_typing # 每段文本打印前重置快进标记 skip_typing = False for idx, char in enumerate(text): # 每打一个字符就检查是不是触发了快进 if skip_typing: # 一次性输出剩下所有没打的字符 sys.stdout.write(text[idx:]) sys.stdout.flush() # 重置标记,不影响下一段打印 skip_typing = False return sys.stdout.write(char) sys.stdout.flush() time.sleep(0.01) def sceneOne(): # 逐字打印第一段剧情,提示直接拼在文本末尾,滚动一开始就能看到 type_print( "insert\n" "text\n" "here\n" "\n[Press enter to continue]\n" ) # 等当前段落完全打印/快进完成后,等用户按回车进下一段 input() type_print( "insert\n" "text\n" "here\n" "\n[Press enter to continue]\n" ) input() sceneOne()
注意事项
- 原来你写的那个自定义函数叫
print,直接把Python内置的print方法给覆盖了,写多了隐蔽bug能把人找疯,改名叫type_print就没这个问题 - 那个后台监听线程一定要加
daemon=True,不然主程序流程走完了,它还在那死等输入,关都关不掉 - 现在这个逻辑的实际效果是:逐字打第一个字符的时候,用户已经能看到下面的提示,哪怕刚看到第一行字,按个回车,剩下的所有文本瞬间全部显示,完全满足老玩家速通的需求,快进的反应延迟基本感知不到
内容的提问来源于stack exchange,提问作者kaser 4886
相关产品推荐
相关产品推荐

