PyCharm 逐字符自动输入工具

简介

一个基于 pyautogui 的 Python 自动化脚本,能够在指定倒计时后模拟键盘逐字符输入代码到 PyCharm 编辑器窗口中,实现"自动敲代码"效果。

适用场景:

  • 演示/录屏时模拟实时编码过程
  • 教学展示中逐步展示代码
  • 避免手动复制粘贴大段代码到编辑器

环境要求

Python >= 3.7
pyautogui >= 0.9.54

安装依赖:

pip install pyautogui

Windows 用户pyautogui 依赖 pywin32,一般会自动安装。若报错可手动执行 pip install pywin32

使用方法

1. 准备代码

将要输入的代码赋值给 TRANSFORMER_CODE 变量(脚本末尾已包含示例)。

2. 运行脚本

python auto_type.py

运行后控制台输出倒计时:

============================================================
PyCharm 逐字符输入工具 — Transformer代码
============================================================
⏳ 请在 5 秒内激活 PyCharm 编辑器窗口...
5 4 3 2 1
🚀 开始输入代码...
📄 代码总字符数: 12345
⏱️  字符间隔: 0.035 秒

3. 操作步骤

  1. 运行脚本
  2. 在倒计时结束前,用鼠标点击 PyCharm 编辑器窗口使其获得焦点
  3. 等待自动输入完成
  4. Ctrl+S 保存文件

核心参数

参数 类型 默认值 说明
code str 必填 要输入的完整代码字符串
delay float 0.035 每个字符之间的间隔(秒)
before_start int 5 开始前的倒计时(秒)

调整速度示例:

# 快速输入(0.02秒/字符)
type_code_in_pycharm(code=MY_CODE, delay=0.02)

# 慢速演示(0.08秒/字符)
type_code_in_pycharm(code=MY_CODE, delay=0.08)

# 缩短倒计时为2秒
type_code_in_pycharm(code=MY_CODE, before_start=2)

安全机制

  • Fail-Safe:将鼠标快速移至屏幕左上角可立即中止输入
  • 输入前校验:空代码会直接报错并退出
  • 异常捕获:任何输入错误不会导致脚本崩溃

工作原理

运行脚本
   │
   ▼
倒计时 N 秒(等待用户切换窗口)
   │
   ▼
pyautogui.write(code, interval=delay)
   │  └─ 逐字符模拟键盘输入
   ▼
输入完成 / 安全中断

pyautogui.write() 调用操作系统级别的键盘事件,模拟真实按键,因此目标应用会把它当作用户手动输入。

已知限制

限制 说明 替代方案
不支持中文 pyautogui.write() 无法输入非 ASCII 字符 改用 pyperclip + Ctrl+V 粘贴
不支持组合键 无法自动输入 Tab、Enter 等特殊键 pyautogui.press('enter') 逐个发送
需要窗口焦点 输入期间目标窗口必须保持前台 确保不切换窗口
速度有上限 过快可能导致字符丢失 delay 不要低于 0.01

改进:支持中文和特殊键

如果代码含中文注释,可改用剪贴板方式:

import pyperclip
import pyautogui
import time

def type_code_safe(code, delay=0.035, chunk_size=50):
    """分块粘贴,兼容中文"""
    for i in range(0, len(code), chunk_size):
        chunk = code[i:i+chunk_size]
        pyperclip.copy(chunk)
        pyautogui.hotkey('ctrl', 'v')
        time.sleep(delay * len(chunk))

常见问题

Q: 输入到一半停了?
A: 检查是否误触了 FailSafe(鼠标碰到了左上角),或目标窗口失去了焦点。

Q: PyCharm 没有反应?
A: 确认 PyCharm 编辑器处于插入模式(光标在代码区闪烁),而非搜索框或弹窗中。

Q: 可以输入到其他编辑器吗?
A: 可以,任何接收键盘输入的窗口都行(VS Code、记事本、终端等)。

Q: 如何自定义要输入的代码?
A: 修改脚本中的 TRANSFORMER_CODE 变量,或从文件读取:

with open('my_code.py', 'r', encoding='utf-8') as f:
    code = f.read()
type_code_in_pycharm(code=code)

完整源码

auto_type.py — 自动输入主脚本

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
PyCharm 逐字符输入工具
运行脚本,倒计时5秒内激活PyCharm编辑器窗口,代码将自动输入。
"""

import time
import pyautogui


def stream_print(message, delay=0.02, end='\n'):
    for ch in message:
        print(ch, end='', flush=True)
        time.sleep(delay)
    print(end=end, flush=True)


def type_code_in_pycharm(code, delay=0.035, before_start=5):
    if not code:
        print("❌ 错误:代码不能为空")
        return False

    pyautogui.PAUSE = 0.01
    pyautogui.FAILSAFE = True

    stream_print(f"⏳ 请在 {before_start} 秒内激活 PyCharm 编辑器窗口...")
    for i in range(before_start, 0, -1):
        stream_print(f"{i} ", end='', delay=0)
        time.sleep(1)
    stream_print("\n🚀 开始输入代码...\n")
    stream_print(f"📄 代码总字符数: {len(code)}")
    stream_print(f"⏱️  字符间隔: {delay:.3f} 秒")

    try:
        pyautogui.write(code, interval=delay)
        print(f"\n✅ 完成!共输入 {len(code)} 个字符")
        return True
    except pyautogui.FailSafeException:
        print("\n⚠️ 安全触发(鼠标移至屏幕左上角)")
        return False
    except Exception as e:
        print(f"\n❌ 错误: {e}")
        return False


TRANSFORMER_CODE = r'''
# 在此处放入要自动输入的目标代码
# 例如:
# -*- coding: utf-8 -*-
"""RAG问答系统 — 后端服务"""

import os
import sys
import time

def hello():
    print("Hello, World!")

if __name__ == '__main__':
    hello()
'''


if __name__ == "__main__":
    print("=" * 60)
    print("PyCharm 逐字符输入工具")
    print("=" * 60)

    type_code_in_pycharm(
        code=TRANSFORMER_CODE,
        delay=0.035,
        before_start=5,
    )
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐