如何定时重复执行代码且不清屏,仅在原位更新NHL实时比分数据
NHL实时比分原地更新实现方案
核心逻辑是利用终端内置的光标控制能力,不需要全量清屏,仅覆盖对应比分位置的内容即可,以下是两种常用实现方式(适配你使用的Python开发环境):
1. 轻量化实现(无第三方依赖)
通过ANSI转义序列控制光标移动,适合简单的比分展示场景,代码示例:
首先添加转义序列常量定义,Windows系统需要额外加一行激活ANSI支持:
import time import requests import os # Windows系统激活终端ANSI支持 os.system('') # 终端控制转义符 CURSOR_UP = '\033[F' # 光标上移一行 CLEAR_LINE = '\033[K' # 清除当前行光标后所有内容
业务逻辑示例:
# 首次全量输出界面框架 print("_" * 46) print("Buffalo Sabres 0") print("Edmonton Oilers 0") print("_" * 46) print("Toronto Maple Leafs 0") print("Calgary Flames 0") print("_" * 46) print("Carolina Hurricanes 0") print("Philadelphia Flyers 0") print("_" * 46) while True: # 拉取NHL API数据 resp = requests.get("你的API请求地址") resp.raise_for_status() jsonResponse = resp.json() # 读取各场比赛主客场进球数,以下为示例,可替换为你实际的多比赛数据读取逻辑 game1_home = jsonResponse["liveData"]['linescore']['teams']['home']['goals'] game1_away = jsonResponse["liveData"]['linescore']['teams']['away']['goals'] # game2_home、game2_away等同理读取 # 光标回退到第一场比赛的主队行位置,总共需要上移9行(对应首次输出的最后9行内容) print(CURSOR_UP * 9, end='') # 逐行更新内容,仅覆盖原有内容,不会产生新行 print(f"{CLEAR_LINE}Buffalo Sabres {game1_home}") print(f"{CLEAR_LINE}Edmonton Oilers {game1_away}") print(f"{CLEAR_LINE}" + "_" * 46) # 第二、三场比赛更新逻辑同上,替换对应球队名称和比分即可 time.sleep(3)
注意事项
- 动态比赛数量场景可先将所有比赛数据存入列表,首次输出时统计总行数,更新时对应调整光标上移行数即可
- 部分极简终端(比如Windows旧版cmd)如果不支持ANSI序列,可替换为第二种实现方案
2. 复杂场景稳定实现
如果后续需要新增控球率、罚时、球员数据等更多展示内容,推荐使用Python标准库curses,可直接指定坐标输出内容,无需手动计算光标位置:
import curses import time import requests def run(stdscr): # 隐藏终端光标 curses.curs_set(0) while True: # API数据拉取逻辑略 # 直接指定行列坐标输出内容,参数为(行号, 列号, 输出内容) stdscr.addstr(0, 0, "_" * 46) stdscr.addstr(1, 0, "Buffalo Sabres") stdscr.addstr(1, 20, str(game1_home)) stdscr.addstr(2, 0, "Edmonton Oilers") stdscr.addstr(2, 20, str(game1_away)) # 其余内容输出逻辑同上 stdscr.refresh() time.sleep(3) if __name__ == "__main__": curses.wrapper(run)
该方案不会出现界面闪烁问题,所有内容更新仅覆盖指定坐标位置,稳定性更高。
内容的提问来源于stack exchange,提问作者AlexLikesWater
相关产品推荐
相关产品推荐

