Python终端运行时菜单输出缺失,添加空print才显示,能否用flush修复?
问题:Python菜单输出延迟,添加空print才显示完整内容?
我在VS Code里结合GitHub开发Python文字冒险游戏,写了菜单脚本:
import time # 原代码遗漏导入,补充后可正常运行 def menuController(menuName:str, options:list): print(options) time.sleep(0.01) menuPosition = 0 for i in range(len(options)): if menuPosition == i: options[i] = "*"+options[i]+"* " else: options[i] = " "+options[i]+" " print(options[i], end="") menuController("ra", ["one", "two", "three", "four"])
运行这段代码时,仅输出:
['one', 'two', 'three', 'four']
格式化后的菜单行缺失;但在调用menuController后添加print(""),就能输出完整内容:
['one', 'two', 'three', 'four'] *one* two three four
想问两个问题:
- 为什么加空print后才显示第二行?
- 能不能在函数定义里用输出flush修复这个问题?
解答
1. 加空print才显示菜单行的原因
Python标准输出默认采用行缓冲机制:只有当输出内容包含换行符(\n),或者缓冲区被填满时,才会把内存中暂存的内容真正输出到终端。
你循环里的print(options[i], end="")去掉了默认的换行符,导致菜单内容一直留在输出缓冲区中,没有被刷到终端显示。而后续添加的print("")会输出一个换行符,触发缓冲区刷新,此时之前存放在缓冲区里的菜单内容才会一同显示出来。
2. 可以用flush参数修复,两种实现方式
第一种,在循环的print语句中直接添加flush=True,每次输出都强制刷新缓冲区:
import time def menuController(menuName:str, options:list): print(options) time.sleep(0.01) menuPosition = 0 for i in range(len(options)): if menuPosition == i: options[i] = "*"+options[i]+"* " else: options[i] = " "+options[i]+" " print(options[i], end="", flush=True) # 强制刷新缓冲区 menuController("ra", ["one", "two", "three", "four"])
第二种,在循环结束后添加一个仅用于刷新缓冲区的print:
import time def menuController(menuName:str, options:list): print(options) time.sleep(0.01) menuPosition = 0 for i in range(len(options)): if menuPosition == i: options[i] = "*"+options[i]+"* " else: options[i] = " "+options[i]+" " print(options[i], end="") print("", flush=True) # 循环结束后统一刷新缓冲区 menuController("ra", ["one", "two", "three", "four"])
两种方式都能让菜单内容直接显示,无需在函数外部额外添加print语句。
内容的提问来源于stack exchange,提问作者Theo Devlin
相关产品推荐
相关产品推荐

