无聊的小东西——自动输入(Python、PyQt5)
前言
本文重点解决pyautogui.typewrite在OJ系统等在线编译系统(或者日常在PyCharm,VScode…等编译器)进行自动输入代码时,产生的缩进问题。以及初接触PyQt5就想上手的小案例。
一、问题展示
自动输入的反面教材
那么为什么会出现这种情况呢?pyautogui.typewrite()明明只是用于将字符串参数进行键盘输入。csv文件里是几个空格,就输出几个空格才对啊?
原因是因为,我们希望在自动输入到编译器中,但是像pycharm这类编译器,自带冒号:后换行缩进一个tab键的长度。
那么问题就简化成了我们只需要把原数据中所有的tab去掉就可以了,让编译器自己进行缩进。(也就是把图中每一行的第二个tab删掉)
二、开始胡说八道
现在我们把问题拆解,简化一下,只关心缩进部分的改良。
import pyautogui
import time
import pandas as pd
b = pd.read_csv(r"C:\Users\HP\Desktop\python_test.csv", encoding='utf-8',header=None)
e = b.iloc[12, 1]
time.sleep(3)
for l in e.split("\n"):
l = l.lstrip() + "\n"
pyautogui.typewrite(l)
我的python_test文件是一个两列多行,第0列是题目,第1列是答案,因为此处我对文件第一行做了一点处理:header=None,使得第一行不作为列名使用,所以题目的序号应该往前推一个,所以13题的答案是b.iloc[12,1] 。
time.sleep(3) 因为后面运行pyautogui.typewrite时是即刻成效的,防止还未确定输入的位置程序就开始运行。这里留了三秒让我们的鼠标快速移动到要打字的地方。
for l in e.split(“\n”) 我们将获得的字符串e以“\n”分割成一行一行的代码,并进行遍历。
l = l.lstrip() + “\n” lstrip()是将字符串最左边的空字符删掉,由于这个函数不能改变元数据,所以我们要将其赋值回给 l ,最后又再添加上“\n”进行换行。这样就做到把原数据每行开头的空格都删掉啦。
现在的缩进就一如往常啦!
三、你以为结束了嘛?
csv文件我知道了,现在再补充一个txt文件,毕竟咱就是说平常使用中,我没那么多题目需要我传答案,就想平常用用,那我也不能写在csv文件里再自动输入哇。没事咱再补充一点对txt文件的自动输入。
这里是使用框.txt文件中放的代码,格式很乱,可以说是完全看不到缩进,而python是最在乎格式的。
import time
import pyautogui
while True:
a = input("是否开始开始为t,结束为n:>")
if a == 't':
time.sleep(3)
b = open(r"C:\Users\HP\Desktop\使用框.txt", encoding='utf-8')
for line in b.readlines():
line = line.lstrip()
pyautogui.typewrite(line)
else:
break
这里唯一改动了的地方就是readlines()是一次读取文件的所有文本,返回值是以行为元素的list,并且每一行后面都会自带一个“\n”。 这东西好,这回连“\n”都不需要我们加了,一个readlines()帮我们解决所有。为了使用方便,每次输入都需要重新启动程序,所以这里我添加的一个while循环。
当然大家也可以看到中文是没有输出的,如果大家想输出中文,可以切换中英文输入法 ,不过效果不是很好哦~ 所以这个就用来在那些不能复制粘贴的app上写写英语小作文,和一些OJ系统上进行编程比赛,摸摸鱼就可以了。
其实你说了这么多好像跟Qt没有半毛钱的关系哈。啊对现在我们又想更便利一点,我不想在txt文件里存了文件,再来运行程序,每次还要对txt文件进行手动清理,很麻烦。来了来了,PyQt5来了!
import sys
import time
import pyautogui
from PyQt5.QtWidgets import *
from PyQt5 import QtCore
class Stats():
def __init__(self):
self.w = QWidget()
self.w.resize(500, 400) # 窗口尺寸
self.w.move(500, 300) # 窗口于显示器位置
self.w.setWindowTitle('模拟复制粘贴') # 窗口标题
# 使窗口停留在最前面
self.w.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
# 创建输入子窗口控件
self.textEdit = QPlainTextEdit(self.w) # 指定父控件
self.textEdit.setPlaceholderText("请输入...") # 提示文本
self.textEdit.move(15, 25)
self.textEdit.resize(300, 350)
# 创建一个按钮控件
self.button = QPushButton('粘贴',self.w)
self.button.clicked.connect(self.Paste) # 信号与槽连接
self.button.move(350,80)
def Paste(self):
info = self.textEdit.toPlainText().split("\n")
time.sleep(3)
for line in info:
line = line.lstrip() + "\n"
pyautogui.typewrite(line)
# 清空textEdit
self.textEdit.clear()
# sys.argv捕获你在命令行运行此脚本时后面输入的所有参数
app = QApplication(sys.argv)
stats = Stats()
stats.w.show() # 窗口显示
app.exec_() # 进入程序的主循环直到exit()被调用
这里也是把获得到的文本内容以"\n"进行分割,删除每行最左边的空格后,再给每行末尾加回“\n”。 好啦,其实注释已经写得很小白了,这里只提两个地方,一个就是self.w.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) 这个可以依据需求使用,保持窗口始终在最上面,这样就方便我使用。再一个就是self.textEdit.clear() 因为不能说每次输入时,上一次的输入内容还存留在窗口中,所以在每次执行完一次后会清空子窗口(就是输入文本的那个窗口)。
当然如果大家只是写写英语作文,不需要更改格式 ,那以上对文本的处理就用不上了,可以自行删除修改,把Paste函数修改一下就可以(其实也就是把删除空格那部分去掉了)
def Paste(self):
info = self.textEdit.toPlainText()
time.sleep(3)
pyautogui.typewrite(info)
# 清空textEdit
self.textEdit.clear()
![在这里插入图片描述](https://img-blog.csdnimg.cn/e106a89e3aa94aab81c22ec7dddf10a7.gif#pic_center)
好了,去摸鱼吧!
总结
解决网页,app不允许复制粘贴的问题,解决pyautogui.typewrite在编译器或在线编译器中自动输入时产生的缩进问题。结合PyQt5做的小窗口,实现自动输入。