前几天在B站看编程视频,发现有人一边在vscode里面输入代码,一边用鼠标讲解代码相关知识,然后仔细一看,发现代码的输入速度是匀速的,而且括号缩进方式也不像人类,原来以为是用了vscode的某些插件,但在网上找了一圈没找到。后来想起了之前用python在ubuntu上面搞过连点器,可以用python模拟键盘操作。但这样有一个缺点,没法输入中文,如果代码里面有不能通过键盘直接输入的文本内容就非常麻烦了。对于这个问题可以采用python的文件io来解决。这样也有缺点,首先是这种方式并不一定能对所有编辑器使用,第二是只能应用在编辑器上,向其他的地方输入就很难做到,最终两个方案都搞了一遍。

模拟输入

这个主要用了pyautogui 这个可以用来操纵鼠标与键盘,还有很多更高级的功能。

安装很简单,直接pip install pyautogui就完事了。

下面是文档里面给出的示例

import pyautogui
pyautogui.write('Hello world!')                 # prints out "Hello world!" instantly
pyautogui.write('Hello world!', interval=0.25)  # prints out "Hello world!" with a quarter second delay after each character
# 上面这两个可以直接安排字符串

pyautogui.keyDown('shift')  # hold down the shift key
pyautogui.press('left')     # press the left arrow key
pyautogui.press('left')     # press the left arrow key
pyautogui.press('left')     # press the left arrow key
pyautogui.keyUp('shift')    # release the shift key

# 这个是处理单个按键的 既可以按一下,又可以按住不动

有了这个会很容易了

在网上也看到过用pyautoguipyperclip结合起来通过剪贴板进行输入的方案,但是没成功。

文件IO

这个就更容易了写入一个字符就保存一次就行了。

效果展示

代码

模拟输入


#!/usr/bin/env python

import sys
import time

import pyautogui as p
import pyperclip as d

p.PAUSE = 0
p.MINIMUM_SLEEP =0
p.MINIMUM_DURATION=0

FIN = sys.argv[1]

if len(sys.argv) > 2:
    stime = 0.25
else:
    stime = float(sys.argv[2])
    pass

time.sleep(1)

with open(FIN, 'r') as f:
    while True:
        text_line = f.readline()
        time.sleep(stime)
        if text_line:
            p.typewrite(text_line, interval=stime)
        else:
            break

文件IO

#!/usr/bin/env python

import sys
import time

FIN = sys.argv[1]
FOUT = sys.argv[2]


if len(sys.argv) > 3:
    stime = 0.25
else:
    stime = float(sys.argv[3])
    pass

time.sleep(1)


def eo(sduq):
    for sdi in sduq:
        su = open(FOUT, 'a')
        su.write(sdi)
        if sdi != ' ':
            time.sleep(stime)
        su.close()
        pass
    time.sleep(0.2)
    pass


with open(FIN, 'r') as f:
    while True:
        text_line = f.readline()
        if text_line:
            eo(text_line)
        else:
            break
pass