【无聊的小东西之自动输入】

无聊的小东西——自动输入(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()

在这里插入图片描述
好了,去摸鱼吧!

总结

解决网页,app不允许复制粘贴的问题,解决pyautogui.typewrite在编译器或在线编译器中自动输入时产生的缩进问题。结合PyQt5做的小窗口,实现自动输入。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
在Java命令行中实现自动输入可以通过使用Java的标准输入输出流来实现。以下是一个简单的例子来演示如何在Java命令行中实现自动输入: ```java import java.util.Scanner; public class CommandLineInput { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 手动输入数据 System.out.print("请输入一个整数:"); int number = scanner.nextInt(); System.out.println("你输入的整数是:" + number); // 通过命令行参数传入输入数据 if (args.length > 0) { int inputNumber = Integer.parseInt(args[0]); System.out.println("命令行传入的整数是:" + inputNumber); } scanner.close(); } } ``` 在上面的例子中,我们使用了`java.util.Scanner`类来读取用户输入的数据。通过`Scanner`类的`nextInt()`方法可以读取用户输入的整数。同时,我们还可以通过命令行参数`args`来获取在运行Java程序时传入的数据。 当我们手动运行上述的Java代码时,程序会在命令行中提示用户输入整数,并读取用户的输入,然后输出该整数。例如,用户输入`10`,则输出为`你输入的整数是:10`。如果我们希望通过命令行参数传入输入数据,则可以在运行Java程序时,添加参数。例如,`java CommandLineInput 20`,则输出为`命令行传入的整数是:20`。 通过这种方式,我们可以在Java命令行中实现自动输入。这对于需要大量测试或模拟用户输入的情况非常有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

afool�‍♂️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值