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 keyboard
local_list = [ ] # 保存操作坐标、动作、文本
begain_time = 0
now_time = 0
text_list = [ ]
input_str = "" # 从键盘输入的数据
click_flag = False
keyborad_flag = False
class window ( QMainWindow, Ui_MainWindow) :
lcd_signal = pyqtSignal ( int ) # 循环计数信号
display_signal = pyqtSignal ( str) # 操作记录显示信号
def __init__ ( self) :
super ( window, self) . __init__ ( )
self. mouse_active = False
self. mouse_listener = None
self. keyboard_active = False
self. keyboard_listener = None
self. 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 = True
self. keyboard_listener = keyboard. Listener ( on_press= self. on_press)
self. keyboard_listener. start ( )
def keyboard_stop ( self) :
if self. keyboard_listener:
self. keyboard_active = False
self. keyboard_listener. stop ( )
def on_press ( self, key) :
global input_str
global begain_time
print ( "键盘事件:" , 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_data
now_time = time. time ( )
action = { }
action[ "act" ] = "note"
action[ "input_text" ] = input_str # 键盘输入的数据 如果需要回车需要贾’\n‘
action[ "sleep" ] = int ( ( now_time - begain_time) ) + 1 # 保存延迟的时间
begain_time = now_time
local_list. append ( action)
print ( local_list)
input_str = ''
self. display_signal. emit ( "输入文本:" + action[ "input_text" ] )
def mouse_start ( self) :
self. mouse_active = True
self. mouse_listener = mouse. Listener ( on_click= self. on_click)
self. mouse_listener. start ( )
def mouse_stop ( self) :
if self. mouse_listener:
self. mouse_active = False
self. mouse_listener. stop ( )
def on_click ( self, x, y, button, pressed) :
global begain_time
global local_list
if 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_time
local_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_list
num = 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_time
global click_flag
global keyborad_flag
global local_list
if 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, QtWidgets
class 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: ignore
self. pushButton_2. clicked. connect ( self. textEdit. clear) # type: ignore
QtCore. QMetaObject. connectSlotsByName ( MainWindow)
def retranslateUi ( self, MainWindow) :
_translate = QtCore. QCoreApplication. translate
MainWindow. 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" , "保存记录" ) )