前几天在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
# 这个是处理单个按键的 既可以按一下,又可以按住不动
有了这个会很容易了
在网上也看到过用pyautogui
和 pyperclip
结合起来通过剪贴板进行输入的方案,但是没成功。
文件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
拿B站当视频床了……