写一个自动化记录鼠标/键盘的动作,然后可以重复执行的python程序
import sys
import threading
import time
from PyQt5.QtWidgets import *
from auto_fun import *
import pyautogui
import pynput
from PyQt5.QtCore import pyqtSignal
from MouseModule import *
from pynput import keyboardlocal_list = [] # 保存操作坐标、动作、文本
begain_time = 0
now_time = 0
text_list = []
input_str = "" # 从键盘输入的数据
click_flag = False
keyborad_flag = Falseclass window(QMainWindow, Ui_MainWindow):lcd_signal = pyqtSignal(int) # 循环计数信号display_signal = pyqtSignal(str) # 操作记录显示信号def __init__(self):super(window, self).__init__()self.mouse_active = Falseself.mouse_listener = Noneself.keyboard_active = Falseself.keyboard_listener = Noneself.setupUi(self)self.init()#初始化def init(self):self.pushButton_3.clicked.connect(self.begin_note)self.pushButton_4.clicked.connect(self.begin_action)self.lcd_signal.connect(self.lcd_signal_fun) #信号触发计时self.display_signal.connect(self.display_signal_fun) #信号触发显示界面def keyboard_start(self):self.keyboard_active = Trueself.keyboard_listener = keyboard.Listener(on_press=self.on_press)self.keyboard_listener.start()def keyboard_stop(self):if self.keyboard_listener:self.keyboard_active = Falseself.keyboard_listener.stop()def on_press(self,key):global input_strglobal begain_timeprint("键盘事件:", key)test_key = str(key) # 必须有这一步否则会出问题 崩溃str_data = test_key.replace("'", "")if str_data == "Key.enter":str_data = '\n'if "Key" not in str_data:input_str = input_str + str_datanow_time = time.time()action = {}action["act"] = "note"action["input_text"] = input_str # 键盘输入的数据 如果需要回车需要贾’\n‘action["sleep"] = int((now_time - begain_time)) + 1 # 保存延迟的时间begain_time = now_timelocal_list.append(action)print(local_list)input_str = ''self.display_signal.emit("输入文本:" + action["input_text"])def mouse_start(self):self.mouse_active = Trueself.mouse_listener = mouse.Listener(on_click=self.on_click)self.mouse_listener.start()def mouse_stop(self):if self.mouse_listener:self.mouse_active = Falseself.mouse_listener.stop()def on_click(self, x, y, button, pressed):global begain_timeglobal local_listif self.mouse_active:if pressed:print('Button {0} pressed at ({1}, {2})'.format(button, x, y))action = {}action["local"] = [x, y]action["act"] = "click"now_time = time.time()action["sleep"] = int((now_time - begain_time)) + 1 # 保存延迟的时间begain_time = now_timelocal_list.append(action) # local_list 操作记录表格self.display_signal.emit("点击坐标:" + str(x) + " " + str(y))def display_signal_fun(self, text):self.textEdit.insertPlainText(text + '\n')def lcd_signal_fun(self, num):self.lcdNumber.display(num + 1)print("动作执行:", num)def action_thread(self):global local_listnum = self.spinBox.text()print("开始执行动作循环")for i in range(0, int(num)):for item in local_list:if item["act"] == "click":pyautogui.click(int(item["local"][0]), int(item["local"][1]))time.sleep(item["sleep"])print("鼠标点击", item["local"][0], item["local"][1])elif item['act'] == "note":pyautogui.typewrite(item["input_text"])time.sleep(item["sleep"])self.lcd_signal.emit(i)# 创建一个线程开始执行记录的动作def begin_action(self):fd = threading.Thread(target=self.action_thread)fd.start()# 开始记录动作def begin_note(self):global begain_timeglobal click_flagglobal keyborad_flagglobal local_listif self.pushButton_3.text() == "开始录制":self.pushButton_3.setText("停止录制")local_list = [] # 清空指令列表self.mouse_start()self.keyboard_start()begain_time = time.time()elif self.pushButton_3.text() == "停止录制":self.pushButton_3.setText("开始录制")print("停止录制")self.mouse_stop()self.keyboard_stop()local_list.pop()print("动作执行列表:", local_list)def main():app = QApplication(sys.argv)win = window()win.show()sys.exit(app.exec_())if __name__ == '__main__':main()
##ui界面
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'auto_fun.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(600, 300)MainWindow.setMinimumSize(QtCore.QSize(600, 300))MainWindow.setMaximumSize(QtCore.QSize(600, 300))self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.centralwidget)self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)self.horizontalLayout_2.setSpacing(0)self.horizontalLayout_2.setObjectName("horizontalLayout_2")self.frame_2 = QtWidgets.QFrame(self.centralwidget)self.frame_2.setMinimumSize(QtCore.QSize(290, 290))self.frame_2.setMaximumSize(QtCore.QSize(290, 290))self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)self.frame_2.setObjectName("frame_2")self.lcdNumber = QtWidgets.QLCDNumber(self.frame_2)self.lcdNumber.setGeometry(QtCore.QRect(70, 30, 131, 51))self.lcdNumber.setStyleSheet("background-color: rgb(0, 111, 166);")self.lcdNumber.setObjectName("lcdNumber")self.pushButton_3 = QtWidgets.QPushButton(self.frame_2)self.pushButton_3.setGeometry(QtCore.QRect(20, 200, 75, 23))self.pushButton_3.setStyleSheet("QPushButton\n"
"{\n"
" /*字体为微软雅黑*/\n"
" font-family:Microsoft Yahei;\n"
" /*字体大小为20点*/\n"
" font-size:10pt;\n"
" /*字体颜色为白色*/ \n"
" color:white;\n"
" /*背景颜色*/ \n"
" background-color:rgb(170 , 170 , 170);\n"
" /*边框圆角半径为8像素*/ \n"
" border-radius:8px;\n"
"}\n"
"QPushButton:hover\n"
"{\n"
" /*背景颜色*/ \n"
" background-color:rgb(44 , 137 , 255);\n"
"}\n"
"\n"
"QPushButton:pressed\n"
"{\n"
" /*背景颜色*/ \n"
" background-color:rgb(14 , 135 , 228);\n"
" /*左内边距为3像素,让按下时字向右移动3像素*/ \n"
" padding-left:3px;\n"
" /*上内边距为3像素,让按下时字向下移动3像素*/ \n"
" padding-top:3px;\n"
"}")self.pushButton_3.setObjectName("pushButton_3")self.pushButton_4 = QtWidgets.QPushButton(self.frame_2)self.pushButton_4.setGeometry(QtCore.QRect(170, 200, 75, 23))self.pushButton_4.setStyleSheet("QPushButton\n"
"{\n"
" /*字体为微软雅黑*/\n"
" font-family:Microsoft Yahei;\n"
" /*字体大小为20点*/\n"
" font-size:10pt;\n"
" /*字体颜色为白色*/ \n"
" color:white;\n"
" /*背景颜色*/ \n"
" background-color:rgb(170 , 170 , 170);\n"
" /*边框圆角半径为8像素*/ \n"
" border-radius:8px;\n"
"}\n"
"QPushButton:hover\n"
"{\n"
" /*背景颜色*/ \n"
" background-color:rgb(44 , 137 , 255);\n"
"}\n"
"\n"
"QPushButton:pressed\n"
"{\n"
" /*背景颜色*/ \n"
" background-color:rgb(14 , 135 , 228);\n"
" /*左内边距为3像素,让按下时字向右移动3像素*/ \n"
" padding-left:3px;\n"
" /*上内边距为3像素,让按下时字向下移动3像素*/ \n"
" padding-top:3px;\n"
"}")self.pushButton_4.setObjectName("pushButton_4")self.layoutWidget = QtWidgets.QWidget(self.frame_2)self.layoutWidget.setGeometry(QtCore.QRect(80, 140, 104, 22))self.layoutWidget.setObjectName("layoutWidget")self.formLayout = QtWidgets.QFormLayout(self.layoutWidget)self.formLayout.setContentsMargins(0, 0, 0, 0)self.formLayout.setObjectName("formLayout")self.spinBox = QtWidgets.QSpinBox(self.layoutWidget)self.spinBox.setObjectName("spinBox")self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.spinBox)self.label = QtWidgets.QLabel(self.layoutWidget)self.label.setStyleSheet("font: 75 11pt \"Agency FB\";")self.label.setObjectName("label")self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)self.horizontalLayout_2.addWidget(self.frame_2)self.frame = QtWidgets.QFrame(self.centralwidget)self.frame.setMinimumSize(QtCore.QSize(290, 290))self.frame.setMaximumSize(QtCore.QSize(290, 290))self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)self.frame.setFrameShadow(QtWidgets.QFrame.Raised)self.frame.setObjectName("frame")self.gridLayout = QtWidgets.QGridLayout(self.frame)self.gridLayout.setContentsMargins(0, 0, 0, 0)self.gridLayout.setSpacing(0)self.gridLayout.setObjectName("gridLayout")self.pushButton_2 = QtWidgets.QPushButton(self.frame)self.pushButton_2.setStyleSheet("/*按钮按下态*/\n"
"QPushButton:pressed\n"
"{\n"
" /*背景颜色*/ \n"
" \n"
" /*左内边距为3像素,让按下时字向右移动3像素*/ \n"
" padding-left:3px;\n"
" /*上内边距为3像素,让按下时字向下移动3像素*/ \n"
" padding-top:3px;\n"
"}")self.pushButton_2.setObjectName("pushButton_2")self.gridLayout.addWidget(self.pushButton_2, 1, 1, 1, 1)self.textEdit = QtWidgets.QTextEdit(self.frame)self.textEdit.setMinimumSize(QtCore.QSize(200, 200))self.textEdit.setMaximumSize(QtCore.QSize(290, 290))self.textEdit.setStyleSheet("background-color: rgb(0, 0, 0);\n"
"color: rgb(255, 255, 255);")self.textEdit.setObjectName("textEdit")self.gridLayout.addWidget(self.textEdit, 0, 0, 1, 2)self.pushButton = QtWidgets.QPushButton(self.frame)self.pushButton.setStyleSheet("/*按钮按下态*/\n"
"QPushButton:pressed\n"
"{\n"
" /*背景颜色*/ \n"
" /*左内边距为3像素,让按下时字向右移动3像素*/ \n"
" padding-left:3px;\n"
" /*上内边距为3像素,让按下时字向下移动3像素*/ \n"
" padding-top:3px;\n"
"}")self.pushButton.setObjectName("pushButton")self.gridLayout.addWidget(self.pushButton, 1, 0, 1, 1)self.horizontalLayout_2.addWidget(self.frame)MainWindow.setCentralWidget(self.centralwidget)self.retranslateUi(MainWindow)# self.pushButton_4.clicked.connect(MainWindow.lower) # type: ignoreself.pushButton_2.clicked.connect(self.textEdit.clear) # type: ignoreQtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))self.pushButton_3.setText(_translate("MainWindow", "开始录制"))self.pushButton_4.setText(_translate("MainWindow", "执行"))self.label.setText(_translate("MainWindow", "执行次数"))self.pushButton_2.setText(_translate("MainWindow", "清空记录"))self.pushButton.setText(_translate("MainWindow", "保存记录"))
相关文章:

写一个自动化记录鼠标/键盘的动作,然后可以重复执行的python程序
import sys import threading import time from PyQt5.QtWidgets import * from auto_fun import * import pyautogui import pynput from PyQt5.QtCore import pyqtSignal from MouseModule import * from pynput import keyboardlocal_list [] # 保存操作坐标、动作、文本 …...

Spring Boot-热部署问题
Spring Boot 热部署问题分析与解决方案 热部署(Hot Deployment)是指在应用程序运行过程中,无需停止应用就可以动态加载新代码、配置或资源,从而提升开发效率。在 Spring Boot 开发中,热部署是一项非常实用的功能&…...

深度学习——管理模型的参数
改编自李沐老师《动手深度学习》5.2. 参数管理 — 动手学深度学习 2.0.0 documentation (d2l.ai) 在深度学习中,一旦我们选择了模型架构并设置了超参数,我们就会进入训练阶段。训练的目标是找到能够最小化损失函数的模型参数。这些参数在训练后用于预测&…...

芯片验证板卡设计原理图:372-基于XC7VX690T的万兆光纤、双FMC扩展的综合计算平台 RISCV 芯片验证平台
基于XC7VX690T的万兆光纤、双FMC扩展的综合计算平台 RISCV 芯片验证平台 一、板卡概述 基于V7的高性能PCIe信号处理板,北京太速科技板卡选用Xilinx 公司Virtex7系列FPGA XC7VX690T-2FFG1761C为处理芯片,板卡提供两个标准FMC插槽,适用于…...

【软设】 系统开发基础
【软设】 系统开发基础 一.软件工程概述 (了解一下大概的流程就行) 1. 可行性分析与项目开发计划 目的:评估项目的经济性、技术性和运营性,判断项目是否值得投资和开发。确定开发时间、预算、所需资源等。 可行性分析ÿ…...

Linux移植之系统烧写
直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 本文仅作为个人笔记使用,方便进一步记录自己的实践总结。 前面我们已经移植好了 uboot 和 linux kernle,制作好了根文件系统。但是我们移植都是通过网络来测试的,在实际的产品开发中…...

【数据结构与算法】LeetCode:双指针法
文章目录 LeetCode:双指针法正序同向而行(快慢指针)移除元素移动零(Hot 100)删除有序数组中的重复项颜色分类(Hot 100)压缩字符串移除链表元素删除排序链表中的重复元素删除排序链表中的重复元素…...

Istio下载及安装
Istio 是一个开源的服务网格,用于连接、管理和保护微服务。以下是下载并安装 Istio 的步骤。 官网文档:https://istio.io/latest/zh/docs/setup/getting-started/ 下载 Istio 前往Istio 发布页面下载适用于您的操作系统的安装文件,或者自动…...

Redis基础数据结构之 Sorted Set 有序集合 源码解读
目录标题 Sorted Set 是什么?Sorted Set 数据结构跳表(skiplist)跳表节点的结构定义跳表的定义跳表节点查询层数设置 Sorted Set 基本操作 Sorted Set 是什么? 有序集合(Sorted Set)是 Redis 中一种重要的数据类型,…...

蓝队技能-应急响应篇Web内存马查杀JVM分析Class提取诊断反编译日志定性
知识点: 1、应急响应-Web内存马-定性&排查 2、应急响应-Web内存马-分析&日志 注:传统WEB类型的内存马只要网站重启后就清除了。 演示案例-蓝队技能-JAVA Web内存马-JVM分析&日志URL&内存查杀 0、环境搭建 参考地址:http…...

递归快速获取机构树型图
一般组织架构都会有层级关系,根部门的parentId一般设置为null或者0等特殊字符,而次级部门及以下的parentId则指向他们父节点的id。 以此为基础,业务上经常会有查询整个组织架构层级关系的需求,返回对象中的children属性用来存储子…...

[Web安全 网络安全]-XSS跨站脚本攻击
文章目录: 一:前言 1.定义 2.漏洞出现的原因 3.鉴别可能存在XSS漏洞的地方 4.攻击原理 5.危害 6.防御 7.环境 7.1 靶场 7.2 自动扫描工具 7.3 手工测试工具 8.payload是什么 二:常用的标签语法 三:XSS的分类 反射…...

数据库数据恢复—SQL Server附加数据库出现“错误823”怎么恢复数据?
SQL Server数据库故障: SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面…...

Vscode 中新手小白使用 Open With Live Server 的坑
背景 最近在家学习尝试前端项目打包的一些事项,既然是打包,那么肯定就会涉及到对打包后文件的访问,以直观的查看打包后的效果 那么肯定就会使用到 Vscode 中 Open With LIve Server 这个功能了,首先这个是一个叫 Live Server 的…...

【深度学习 transformer】Transformer与ResNet50在自定义数据集图像分类中的效果比较
在深度学习领域,图像分类是一个经典且重要的任务。近年来,Transformer架构在自然语言处理领域取得了显著成功,逐渐被引入计算机视觉任务。与此同时,ResNet50作为一种经典的卷积神经网络(CNN),在…...

【系统架构设计师】专业英语90题(附答案详解)
更多内容请见: 备考系统架构设计师-核心总结索引 文章目录 【第1~5题】【第6~10题】【第11~15题】【第16~20题】【第21~25题】【第26~30题】【第31~35题】【第36~40题】【第41~45题】【第46~50题】【第51~55题】【第56~60题】【第61~65题】【第66~70题】【第71~75题】【第76~8…...

ItemXItemEffect | ItemEffect
目录 ItemXItemEffect ItemEffectID ItemID ItemEffect ID TriggerType Charges CoolDownMSec SpellID SpellCategoryID CategoryCoolDownMSec ItemXItemEffect.db2 ItemEffectID 物品效果编号,取值链接 ItemEffect.db2 ItemID 物品 ID ItemEffect.d…...

web 动画库
web动画库 动画领域有一个比较知名的CSS库:Animate.css,它提供了60多种动画,满足一般网页的需求,比如淡入淡出、闪现等等一系列日常动画,不过虽然它能满足日常需求,但是一些复杂的场景就需要靠JS手动去操作…...

我的AI工具箱Tauri版-MicrosoftTTS文本转语音
本教程基于自研的AI工具箱Tauri版进行MicrosoftTTS文本转语音服务。 MicrosoftTTS文本转语音服务 是自研的AI工具箱Tauri版中的一款功能模块,专为实现高效的文本转语音操作而设计。通过集成微软TTS服务,用户可以将大量文本自动转换为自然流畅的语音文件…...

【Webpack--013】SourceMap源码映射设置
🤓😍Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-前端领域博主 🐱🐉若此文你认为写的不错,不要吝啬你的赞扬,求收藏,求评论,求一个大大的赞!👍* &#x…...

创新驱动,技术引领:2025年广州见证汽车电子技术新高度
汽车行业的创新浪潮正汹涌澎湃,一场引领未来出行的科技盛宴即将拉开帷幕! AUTO TECH 2025 第十二届广州国际汽车电子技术展览会将于 2025 年 11 月 20日至 22 日在广州保利世贸博览馆(PWTC Expo)隆重举行。 作为亚洲地区领先的汽…...

Spring Boot框架在心理教育辅导系统中的应用案例
目 录 摘 要 I ABSTRACT II 1绪 论 1 1.1研究背景 1 1.2设计原则 1 1.3论文的组织结构 2 2 相关技术简介 3 2.1Java技术 3 2.2B/S结构 3 2.3MYSQL数据库 4 2.4Springboot框架 4 3 系统分析 6 3.1可行性分析 6 3.1.1技术可行性 6 3.1.2操作可行性 6 3.1.3经济可行性 6 3.1.4法律…...

Shiro-550—漏洞分析(CVE-2016-4437)
文章目录 漏洞原理源码分析加密过程解密过程 漏洞复现 漏洞原理 Shiro-550(CVE-2016-4437)反序列化漏洞 在调试cookie加密过程的时候发现开发者将AES用来加密的密钥硬编码了,并且所以导致我们拿到密钥后可以精心构造恶意payload替换cookie,然后让后台最…...

【例题】lanqiao4425 咖啡馆订单系统
样例输入 3 2 2 1 3 1 2样例输出 3 2样例说明 输入的数组为:【3,1,2】 增量序列为:【2,1】 当增量 h2:对于每一个索引 i,我们会将数组元素 arr[i] 与 arr[i−h] 进行比较,并进行可…...

从小白到大神:C语言预处理与编译环境的完美指南(下)
从小白到大神:C语言预处理与编译环境的完美指南(上)-CSDN博客 👆👆👆👆👆👆上篇链接在这~~👆👆👆👆👆&#x…...

3657A/B/AM/BM矢量网络分析仪
苏州新利通 3657A/B/AM/BM 矢量网络分析仪 3657系列矢量网络分析仪适用于无线通信、有线电视、教育及汽车电子等领域,可用于对滤波器、放大器、天线、电缆、有线电视分接头等射频元件的性能测量。该产品采用Windows操作系统;具有误差校准功能、时域功能…...

卸载完mathtype后,删除word加载项中的mathtype
请参考博客“卸载完mathtype后,word加载项中还是有mathtype的解决方法_怎么删除word加载项里的mathtype-CSDN博客”以及 “安装卸载MathType经验解决MathType DLL找不到的问题——超实用_mathtype dll cannot-CSDN博客” 如果在删除.dotm文件时,删不掉…...

vue 实现tab菜单切换
1、目标: 实现切换tab菜单,激活状态,按钮高亮,显示对应的菜单内容 2、实现 <template><div class"tan_menu"><ul class"container"><liclass"item"v-for"item in tab…...

大数据Flink(一百二十):Flink SQL自定义函数(UDF)
文章目录 Flink SQL自定义函数(UDF) 一、概述 二、自定义标量函数(UDSF) 三、自定义聚合函数(UDAF) 四、 自定义表值函数(UDTF) Flink SQL自定义函数…...

【图像检索】基于灰度共生矩的纹理图像检索,matlab实现
博主简介:matlab图像代码项目合作(扣扣:3249726188) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于灰度共生矩的纹理图像检索,用matlab实现。 一、案例背景和算法介绍 …...