Python键盘输入处理:从基础原理到跨平台实战应用
在实际开发过程中键盘输入处理是一个基础但容易出问题的环节。无论是桌面应用、Web 前端还是嵌入式设备开发者都需要准确捕获用户的按键事件并处理不同操作系统、浏览器或硬件带来的兼容性问题。本文将以 Python 为例深入讲解如何通过标准库函数获取键盘输入并扩展到常见场景下的完整解决方案。1. 理解键盘输入捕获的基本原理键盘输入捕获的本质是监听操作系统底层传递的按键事件。不同编程语言和平台提供了不同层次的 API 来实现这一功能。1.1 操作系统层面的键盘事件流当用户按下键盘时硬件会产生中断信号操作系统内核的驱动程序会将这些信号转换为标准的键盘事件。这些事件被放入系统事件队列然后分发给当前获得焦点的应用程序。在 Windows 系统中这套机制通过 Windows API 的GetAsyncKeyState或GetKeyState函数暴露在 Linux 和 macOS 上则可以通过设备文件如/dev/input/event*或 X Window 系统的事件机制来访问。1.2 编程语言提供的抽象层大多数编程语言不会让开发者直接操作底层系统 API而是提供了更高级的抽象。Python 的标准库msvcrtWindows和cursesUnix-like就是这样的抽象层它们封装了不同平台的底层差异让开发者可以用统一的方式处理键盘输入。2. Python 中获取键盘输入的标准方法Python 提供了多个模块来处理键盘输入选择哪个模块取决于你的具体需求是需要简单的单字符输入还是需要实时监听按键事件。2.1 使用 input() 函数进行行输入input()函数是 Python 中最基础的键盘输入方法它会等待用户输入一行文本并按回车键确认# 基本用法 user_input input(请输入内容: ) print(f你输入的是: {user_input}) # 类型转换示例 try: number int(input(请输入数字: )) print(f输入的数字是: {number}) except ValueError: print(输入的不是有效数字)input()函数的特点阻塞式程序会暂停执行直到用户按下回车行缓冲只有在用户按下回车后才会返回输入内容返回字符串无论输入什么都返回字符串类型2.2 使用 msvcrt 模块实现实时按键检测Windows对于需要实时响应按键而不等待回车的场景在 Windows 平台上可以使用msvcrt模块import msvcrt import time def real_time_keyboard_windows(): print(实时按键检测Windows- 按 q 退出) while True: if msvcrt.kbhit(): # 检查是否有按键按下 key msvcrt.getch() # 获取按键字符 key_char key.decode(utf-8) # 转换为字符 print(f按下了: {key_char} (ASCII: {ord(key_char)})) if key_char.lower() q: print(退出检测) break else: # 没有按键时可以做其他事情 time.sleep(0.1) # 仅在 Windows 上运行 if __name__ __main__ and os.name nt: real_time_keyboard_windows()2.3 使用 curses 模块实现跨平台实时输入Unix-like 系统在 Linux 和 macOS 系统上可以使用curses模块来处理键盘输入import curses import sys def real_time_keyboard_unix(stdscr): stdscr.nodelay(True) # 设置非阻塞模式 stdscr.clear() stdscr.addstr(0, 0, 实时按键检测 - 按 q 退出) stdscr.refresh() while True: try: key stdscr.getch() # 获取按键代码 if key ! -1: # -1 表示没有按键 if key ord(q) or key ord(Q): break stdscr.addstr(1, 0, f按键代码: {key}, 字符: {chr(key) if 32 key 126 else 非打印字符}) stdscr.refresh() except KeyboardInterrupt: break # 在 Unix-like 系统上运行 if __name__ __main__ and os.name posix: curses.wrapper(real_time_keyboard_unix)3. 跨平台键盘输入处理方案在实际项目中我们经常需要编写能在多个操作系统上运行的代码。以下是几种可靠的跨平台解决方案。3.1 使用 keyboard 第三方库keyboard库是一个功能强大的跨平台键盘处理库支持按键监听、模拟按键等功能import keyboard import time def cross_platform_keyboard_listener(): print(跨平台键盘监听 - 按 ESC 退出) # 注册全局热键 keyboard.add_hotkey(ctrlshifta, lambda: print(触发了 CtrlShiftA)) # 实时按键监听 def on_key_event(event): print(f事件类型: {event.event_type}, 按键: {event.name}) if event.event_type keyboard.KEY_DOWN and event.name esc: print(退出监听) return False # 返回 False 停止监听 # 开始监听 keyboard.hook(on_key_event) keyboard.wait(esc) # 等待 ESC 键退出 # 安装: pip install keyboard if __name__ __main__: cross_platform_keyboard_listener()3.2 使用 pynput 库进行高级键盘控制pynput是另一个强大的跨平台输入控制库提供了更细粒度的控制from pynput import keyboard import threading class KeyboardManager: def __init__(self): self.current_keys set() self.listener None def on_press(self, key): try: key_char key.char except AttributeError: key_char str(key) if key_char not in self.current_keys: self.current_keys.add(key_char) print(f按下: {key_char} | 当前按下: {self.current_keys}) def on_release(self, key): try: key_char key.char except AttributeError: key_char str(key) if key_char in self.current_keys: self.current_keys.remove(key_char) print(f释放: {key_char} | 当前按下: {self.current_keys}) # 按 ESC 退出 if key keyboard.Key.esc: print(退出键盘监听) return False def start_listening(self): self.listener keyboard.Listener( on_pressself.on_press, on_releaseself.on_release) self.listener.start() self.listener.join() # 使用示例 if __name__ __main__: manager KeyboardManager() manager.start_listening()4. 特殊按键和组合键的处理在实际应用中我们经常需要处理功能键、组合键等特殊按键情况。4.1 常见特殊按键的识别不同库对特殊按键的表示方式不同以下是常见特殊按键的处理示例import keyboard def special_keys_demo(): print(特殊按键检测 - 按 F1 或 CtrlC 测试) # 功能键检测 keyboard.on_press_key(f1, lambda e: print(F1 被按下)) keyboard.on_press_key(f2, lambda e: print(F2 被按下)) # 修饰键组合 keyboard.add_hotkey(ctrlaltdelete, lambda: print(CtrlAltDel 组合)) keyboard.add_hotkey(winr, lambda: print(WindowsR 运行对话框)) # 方向键 keyboard.on_press_key(up, lambda e: print(上箭头)) keyboard.on_press_key(down, lambda e: print(下箭头)) keyboard.wait(esc) if __name__ __main__: special_keys_demo()4.2 自定义组合键逻辑实现有时候我们需要实现复杂的组合键逻辑比如顺序按键或长按检测import keyboard import time class AdvancedKeyCombo: def __init__(self): self.key_sequence [] self.last_key_time 0 self.sequence_timeout 1.0 # 序列超时时间秒 def check_konami_code(self): 检测科乐美密码上上下下左右左右BA expected_sequence [up, up, down, down, left, right, left, right, b, a] if len(self.key_sequence) len(expected_sequence): recent_keys self.key_sequence[-len(expected_sequence):] if recent_keys expected_sequence: print(科乐美密码激活) self.key_sequence.clear() return True return False def on_key_event(self, event): current_time time.time() # 检查序列是否超时 if current_time - self.last_key_time self.sequence_timeout: self.key_sequence.clear() self.key_sequence.append(event.name) self.last_key_time current_time # 检查特殊组合 self.check_konami_code() # 实时显示最近按键 recent self.key_sequence[-5:] if len(self.key_sequence) 5 else self.key_sequence print(f最近按键: {recent}) def advanced_combo_demo(): combo_detector AdvancedKeyCombo() keyboard.hook(combo_detector.on_key_event) print(高级组合键检测 - 尝试输入科乐美密码) keyboard.wait(esc) if __name__ __main__: advanced_combo_demo()5. 键盘输入在图形界面中的应用在 GUI 应用程序中键盘输入处理与命令行程序有所不同需要与界面事件系统集成。5.1 Tkinter 中的键盘事件处理Tkinter 是 Python 的标准 GUI 库以下是键盘事件处理示例import tkinter as tk from tkinter import messagebox class KeyboardGUIApp: def __init__(self): self.root tk.Tk() self.root.title(键盘事件演示) self.root.geometry(400x300) self.setup_ui() self.bind_events() def setup_ui(self): self.text_area tk.Text(self.root, height10, width50) self.text_area.pack(pady10) self.status_label tk.Label(self.root, text按键信息将显示在这里) self.status_label.pack() self.clear_button tk.Button(self.root, text清空, commandself.clear_text) self.clear_button.pack(pady5) def bind_events(self): # 绑定键盘事件到整个窗口 self.root.bind(KeyPress, self.on_key_press) self.root.bind(KeyRelease, self.on_key_release) # 特殊组合键 self.root.bind(Control-c, self.on_copy) self.root.bind(Control-v, self.on_paste) self.root.bind(F1, self.on_help) def on_key_press(self, event): key_info f按下: 字符{event.char} 键码{event.keycode} 键名{event.keysym}\n self.text_area.insert(tk.END, key_info) self.text_area.see(tk.END) self.status_label.config(textf最后按下: {event.keysym}) def on_key_release(self, event): # 可以在这里处理按键释放逻辑 pass def on_copy(self, event): self.text_area.insert(tk.END, CtrlC 被按下 - 模拟复制操作\n) return break # 阻止默认行为 def on_paste(self, event): self.text_area.insert(tk.END, CtrlV 被按下 - 模拟粘贴操作\n) return break def on_help(self, event): messagebox.showinfo(帮助, 这是一个键盘事件演示程序) return break def clear_text(self): self.text_area.delete(1.0, tk.END) def run(self): self.root.mainloop() if __name__ __main__: app KeyboardGUIApp() app.run()5.2 PyQt 中的键盘事件处理对于更复杂的 GUI 应用PyQt 提供了更强大的键盘事件处理能力import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit, QVBoxLayout, QWidget, QLabel from PyQt5.QtCore import Qt class QtKeyboardApp(QMainWindow): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setWindowTitle(PyQt 键盘事件演示) self.setGeometry(100, 100, 500, 400) central_widget QWidget() self.setCentralWidget(central_widget) layout QVBoxLayout() self.text_edit QTextEdit() self.status_label QLabel(按键信息将显示在这里) layout.addWidget(self.text_edit) layout.addWidget(self.status_label) central_widget.setLayout(layout) def keyPressEvent(self, event): key event.key() text event.text() if key Qt.Key_Escape: self.close() elif key Qt.Key_F1: self.text_edit.append(F1 按下 - 显示帮助) elif event.modifiers() Qt.ControlModifier and key Qt.Key_S: self.text_edit.append(CtrlS 按下 - 保存操作) event.accept() # 标记为已处理 else: key_info f按键: 代码{key}, 文本{text}, 修饰键{event.modifiers()} self.text_edit.append(key_info) self.status_label.setText(f最后按键: {key}) # 调用父类处理其他默认行为 super().keyPressEvent(event) def keyReleaseEvent(self, event): # 处理按键释放事件 if event.key() Qt.Key_Space: self.text_edit.append(空格键释放) super().keyReleaseEvent(event) if __name__ __main__: app QApplication(sys.argv) window QtKeyboardApp() window.show() sys.exit(app.exec_())6. 常见问题排查与解决方案键盘输入处理中经常会遇到各种问题以下是典型问题及其解决方案。6.1 权限问题导致的输入捕获失败在 Linux 系统上普通用户可能没有权限访问输入设备import os import subprocess def check_input_permission(): 检查输入设备权限 input_devices [ /dev/input/event0, /dev/input/event1, /dev/input/mice ] for device in input_devices: if os.path.exists(device): try: with open(device, rb) as f: print(f{device} 可访问) except PermissionError: print(f{device} 权限不足尝试以下解决方案:) print(1. 使用 sudo 运行程序) print(2. 将用户添加到 input 组: sudo usermod -a -G input $USER) print(3. 修改设备权限: sudo chmod ar {device}) # 检查权限 check_input_permission()6.2 跨平台兼容性问题处理不同操作系统在键盘编码和行为上存在差异import platform import sys def detect_environment(): 检测运行环境 system platform.system().lower() python_version sys.version_info print(f操作系统: {system}) print(fPython 版本: {python_version.major}.{python_version.minor}.{python_version.micro}) # 根据环境选择不同的键盘处理策略 if system windows: print(推荐使用: msvcrt 或 keyboard 库) return windows elif system in [linux, darwin]: # darwin 是 macOS print(推荐使用: curses 或 pynput 库) return unix else: print(使用跨平台库: keyboard 或 pynput) return other def platform_specific_keyboard(): 平台特定的键盘处理 env detect_environment() if env windows: try: import msvcrt # Windows 特定实现 pass except ImportError: print(在非 Windows 系统上无法导入 msvcrt) elif env unix: try: import curses # Unix 特定实现 pass except ImportError: print(curses 模块不可用) # 环境检测示例 detect_environment()6.3 键盘输入处理中的常见错误下表总结了键盘输入处理中的典型问题及解决方案问题现象可能原因检查方法解决方案程序无响应阻塞式输入等待检查是否调用了阻塞的 input()使用非阻塞输入或超时机制按键无法捕获权限不足或焦点问题检查程序是否拥有输入焦点提升权限或确保窗口激活特殊按键识别错误键码映射不一致打印键码进行调试使用跨平台库的统一抽象组合键不生效事件绑定方式错误检查事件绑定顺序使用库提供的组合键API性能问题频繁的事件处理监控CPU使用率优化事件处理逻辑添加去抖7. 生产环境最佳实践在实际项目中使用键盘输入功能时需要考虑性能、安全性和可维护性。7.1 性能优化建议键盘事件处理应该高效且不影响主程序性能import time import threading from collections import deque class OptimizedKeyboardManager: def __init__(self, max_queue_size100): self.key_events deque(maxlenmax_queue_size) self.is_listening False self.listener_thread None def start_async_listening(self): 异步启动键盘监听 self.is_listening True self.listener_thread threading.Thread(targetself._listen_loop) self.listener_thread.daemon True # 设置为守护线程 self.listener_thread.start() def _listen_loop(self): 监听循环 - 在实际项目中实现具体的监听逻辑 try: import keyboard def on_event(event): if self.is_listening: event_data { timestamp: time.time(), type: event.event_type, key: event.name, scan_code: event.scan_code } self.key_events.append(event_data) keyboard.hook(on_event) # 保持线程运行 while self.is_listening: time.sleep(0.1) except ImportError: print(keyboard 库未安装使用 pip install keyboard 安装) def stop_listening(self): 停止监听 self.is_listening False if self.listener_thread: self.listener_thread.join(timeout1.0) def get_recent_events(self, count10): 获取最近的事件 return list(self.key_events)[-count:] # 使用示例 manager OptimizedKeyboardManager() manager.start_async_listening() # 主程序可以继续执行其他任务 try: while True: recent manager.get_recent_events(5) if recent: print(f最近按键: {recent}) time.sleep(1) except KeyboardInterrupt: manager.stop_listening()7.2 安全考虑键盘输入处理涉及用户隐私需要特别注意安全性import hashlib import hmac import os class SecureKeyboardHandler: def __init__(self, secret_keyNone): self.secret_key secret_key or os.urandom(32) self.sensitive_patterns [ password, pwd, secret, key, token, auth, login ] def is_sensitive_input(self, text): 检测是否包含敏感信息 text_lower text.lower() return any(pattern in text_lower for pattern in self.sensitive_patterns) def secure_log_keypress(self, key_data): 安全地记录按键数据 if self.is_sensitive_input(key_data.get(key, )): # 对敏感按键进行哈希处理 secured_key hmac.new( self.secret_key, key_data[key].encode(), hashlib.sha256 ).hexdigest()[:8] log_entry { timestamp: key_data[timestamp], key: fREDACTED_{secured_key}, type: key_data[type] } else: log_entry key_data # 在实际项目中这里可以写入安全日志 print(f安全日志: {log_entry}) return log_entry # 安全处理示例 secure_handler SecureKeyboardHandler() # 模拟按键数据 test_events [ {timestamp: time.time(), key: a, type: down}, {timestamp: time.time(), key: p, type: down}, {timestamp: time.time(), key: a, type: down}, {timestamp: time.time(), key: s, type: down}, {timestamp: time.time(), key: s, type: down}, {timestamp: time.time(), key: w, type: down}, {timestamp: time.time(), key: o, type: down}, {timestamp: time.time(), key: r, type: down}, {timestamp: time.time(), key: d, type: down}, ] for event in test_events: secure_handler.secure_log_keypress(event)键盘输入处理是许多应用程序的基础功能从简单的命令行工具到复杂的图形界面应用都需要可靠的键盘交互。选择适合项目需求的库和实现方案注意跨平台兼容性和性能优化就能构建出稳定可靠的键盘输入处理模块。在实际项目中建议优先使用成熟的第三方库如keyboard或pynput它们已经处理了大多数底层兼容性问题。

相关新闻

忠孝难两全:从历史典故到现代价值冲突的平衡智慧

忠孝难两全:从历史典故到现代价值冲突的平衡智慧

“儿不孝,儿敬忠”——这句话乍看之下似乎充满了矛盾,甚至有些刺耳。在传统观念里,“孝”与“忠”本应是相辅相成的美德,为何会以如此对立的形式出现?这背后究竟隐藏着怎样的历史故事、伦理困境或个人抉择?…

2026/10/12 9:14:34 阅读更多 →
C++进阶:C++11相关

C++进阶:C++11相关

◆博主名称:少司府 欢迎来到少司府的博客☆*: .。. o(≧▽≦)o .。.:*☆ ⭐数据结构系列个人专栏: 初阶数据结构_少司府的博客-CSDN博客 ⭐C基础个人专栏: C初阶_少司府的博客-CSDN博客 ⭐琢玉成器终有时&#xff…

2026/10/12 9:14:59 阅读更多 →
C++实现WAV音频波形可视化:从文件解析到图形绘制完整指南

C++实现WAV音频波形可视化:从文件解析到图形绘制完整指南

1. 项目概述与核心价值最近在整理一些老旧的音频处理项目时,翻到了一个自己几年前写的C小工具,核心功能就是读取标准的WAV音频文件,然后把里面的声音数据画成波形图。这玩意儿虽然看起来简单,不就是读文件画图嘛,但真正…

2026/10/12 10:05:11 阅读更多 →

最新新闻

Java全栈演唱会售票系统开发与高并发优化实践

Java全栈演唱会售票系统开发与高并发优化实践

1. 项目概述与核心价值演唱会售票系统是连接演出主办方与观众的关键数字化桥梁。这个基于Java技术栈的全栈解决方案,通过SpringBoot/SSM后端Vue前端uniapp多端的组合架构,实现了从票务管理、在线选座到移动端购票的完整闭环。我在实际票务系统开发中发现…

2026/10/13 11:03:11 阅读更多 →
C++ Windows守护进程与进程保护:从Job Object到心跳检测的完整工程实践

C++ Windows守护进程与进程保护:从Job Object到心跳检测的完整工程实践

简介:一套用C实现的守护进程保护方案,面向需要防止C#程序被意外终止或强制关闭的Windows开发者。核心思路是在C动态链接库中封装钩子与进程监控逻辑,再注入到C#目标进程,一旦检测到结束请求便及时拦截,已在Win7系统实测…

2026/10/13 11:03:11 阅读更多 →
Apriori算法Python实现:带数据集完整代码,轻松挖掘关联规则

Apriori算法Python实现:带数据集完整代码,轻松挖掘关联规则

简介:面向数据分析与数据挖掘初学者,这份小体积资料提供Apriori算法的Python实现及配套交易数据集,帮助理解关联规则、频繁项集与支持度、置信度的完整流程,并掌握“购买啤酒也可能购买尿布”这类规则背后的计算逻辑。压缩包内共两…

2026/10/13 11:03:11 阅读更多 →
植物大战僵尸Python源码解析:跑通、读懂、扩展

植物大战僵尸Python源码解析:跑通、读懂、扩展

简介:这份Python版植物大战僵尸源码包,专为Python初学者和游戏开发入门者准备,可作为课程设计、实训项目或兴趣练手的完整参考。资源同时包含可直接运行的代码与全部配套图像素材,下载解压后即可启动游戏,省去自己绘制…

2026/10/13 11:03:11 阅读更多 →
Flyway实战:数据库版本自动化管理解决环境差异与脚本漂移

Flyway实战:数据库版本自动化管理解决环境差异与脚本漂移

1. 手工管理数据库脚本的至暗时刻:环境差异与不确定交付 先讲一段我自己的经历。几年前接手一个跑了大半年的电商后台订单系统,第一眼看到的东西不是代码,而是共享网盘里一整排命名的SQL文件,什么“订单表脚本_FINAL”“order表结…

2026/10/13 11:03:11 阅读更多 →
机器学习入门第一性原理:线性模型核心推导与工程实践

机器学习入门第一性原理:线性模型核心推导与工程实践

1. 为什么线性模型是机器学习入门的“第一性原理”很多人学机器学习,一上来就被各种深度网络、注意力机制、Transformer 架构唬住了,觉得线性模型太简单、太基础,不值得花时间。但我带了这么多届学生、看了这么多份简历和项目,一个…

2026/10/13 11:02:04 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →