Pyqt5-定时截屏工具V1.0
文章目录
前言
主要为了记录截屏数据,包括:自动定时截图,自动循环定时截图,增加置顶显示字样等功能。
一、设计UI
- 先通过designer工具设计UI界面,明确功能及其使用逻辑。
1、先设计主界面UI,auto.ui文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>363</width>
<height>450</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string><html><head/><body><p align="center">时间选择:</p></body></html></string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBox">
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<item>
<property name="text">
<string>0.1</string>
</property>
</item>
<item>
<property name="text">
<string>0.5</string>
</property>
</item>
<item>
<property name="text">
<string>1</string>
</property>
</item>
<item>
<property name="text">
<string>2</string>
</property>
</item>
<item>
<property name="text">
<string>3</string>
</property>
</item>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_5">
<property name="text">
<string>单位(小时)</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string><html><head/><body><p align="center">保存路径:</p></body></html></string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="QLineEdit" name="lineEdit">
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string><html><head/><body><p align="center">开始时间:</p></body></html></string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string><html><head/><body><p align="center">结束时间</p></body></html></string>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QPushButton" name="pushButton_2">
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>启动</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="4">
<widget class="QGroupBox" name="groupBox">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="title">
<string>显示</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QTextBrowser" name="textBrowser"/>
</item>
</layout>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QLineEdit" name="lineEdit_2">
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2">
<widget class="QLineEdit" name="lineEdit_3">
<property name="minimumSize">
<size>
<width>0</width>
<height>25</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>363</width>
<height>23</height>
</rect>
</property>
<widget class="QMenu" name="menu">
<property name="title">
<string>文件</string>
</property>
</widget>
<addaction name="menu"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
2、将auto.ui文件,转化为py文件,Ui_auto.py文件如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'e:\自动化工作项目\定时自动截屏保存工具\UI\auto.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(363, 450)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout_2.setObjectName("gridLayout_2")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setObjectName("label")
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setMinimumSize(QtCore.QSize(0, 25))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.gridLayout_2.addWidget(self.comboBox, 0, 1, 1, 1)
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setObjectName("label_5")
self.gridLayout_2.addWidget(self.label_5, 0, 2, 1, 1)
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setObjectName("label_2")
self.gridLayout_2.addWidget(self.label_2, 1, 0, 1, 1)
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setMinimumSize(QtCore.QSize(0, 25))
self.lineEdit.setObjectName("lineEdit")
self.gridLayout_2.addWidget(self.lineEdit, 1, 1, 1, 2)
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setObjectName("label_3")
self.gridLayout_2.addWidget(self.label_3, 2, 0, 1, 1)
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setObjectName("label_4")
self.gridLayout_2.addWidget(self.label_4, 3, 0, 1, 1)
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setMinimumSize(QtCore.QSize(0, 25))
self.pushButton_2.setMaximumSize(QtCore.QSize(100, 16777215))
self.pushButton_2.setObjectName("pushButton_2")
self.gridLayout_2.addWidget(self.pushButton_2, 3, 3, 1, 1)
self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
self.groupBox.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.groupBox.setObjectName("groupBox")
self.gridLayout = QtWidgets.QGridLayout(self.groupBox)
self.gridLayout.setObjectName("gridLayout")
self.textBrowser = QtWidgets.QTextBrowser(self.groupBox)
self.textBrowser.setObjectName("textBrowser")
self.gridLayout.addWidget(self.textBrowser, 0, 0, 1, 1)
self.gridLayout_2.addWidget(self.groupBox, 4, 0, 1, 4)
self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_2.setMinimumSize(QtCore.QSize(0, 25))
self.lineEdit_2.setObjectName("lineEdit_2")
self.gridLayout_2.addWidget(self.lineEdit_2, 2, 1, 1, 2)
self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_3.setMinimumSize(QtCore.QSize(0, 25))
self.lineEdit_3.setObjectName("lineEdit_3")
self.gridLayout_2.addWidget(self.lineEdit_3, 3, 1, 1, 2)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 363, 23))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.menubar.addAction(self.menu.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">时间选择:</p></body></html>"))
self.comboBox.setItemText(0, _translate("MainWindow", "0.1"))
self.comboBox.setItemText(1, _translate("MainWindow", "0.5"))
self.comboBox.setItemText(2, _translate("MainWindow", "1"))
self.comboBox.setItemText(3, _translate("MainWindow", "2"))
self.comboBox.setItemText(4, _translate("MainWindow", "3"))
self.label_5.setText(_translate("MainWindow", "单位(小时)"))
self.label_2.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">保存路径:</p></body></html>"))
self.label_3.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">开始时间:</p></body></html>"))
self.label_4.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">结束时间</p></body></html>"))
self.pushButton_2.setText(_translate("MainWindow", "启动"))
self.groupBox.setTitle(_translate("MainWindow", "显示"))
self.menu.setTitle(_translate("MainWindow", "文件"))
3、设计透明显示字样的窗口,touming.ui文件如下;
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>show_window</class>
<widget class="QMainWindow" name="show_window">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>974</width>
<height>194</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgba(255, 255, 255, 0.5)</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QTextEdit" name="textEdit">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>100</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255, 60);</string>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="lineWrapMode">
<enum>QTextEdit::WidgetWidth</enum>
</property>
<property name="html">
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;">
<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p>
<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:72pt; font-weight:600; color:#ff0000;">测试勿动</span></p></body></html></string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>974</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
4、将touming.ui文件,转化为py文件,Ui_touming.py文件如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'e:\自动化工作项目\定时自动截屏保存工具\UI\touming.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_show_window(object):
def setupUi(self, show_window):
show_window.setObjectName("show_window")
show_window.resize(974, 194)
show_window.setStyleSheet("background-color: rgba(255, 255, 255, 0.5)")
self.centralwidget = QtWidgets.QWidget(show_window)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
spacerItem = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem, 0, 0, 1, 1)
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit.setEnabled(False)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(100)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.textEdit.sizePolicy().hasHeightForWidth())
self.textEdit.setSizePolicy(sizePolicy)
self.textEdit.setAcceptDrops(True)
self.textEdit.setStyleSheet("background-color: rgb(255, 255, 255, 60);")
self.textEdit.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.textEdit.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.textEdit.setLineWrapMode(QtWidgets.QTextEdit.WidgetWidth)
self.textEdit.setObjectName("textEdit")
self.gridLayout.addWidget(self.textEdit, 1, 0, 1, 1)
show_window.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(show_window)
self.menubar.setGeometry(QtCore.QRect(0, 0, 974, 23))
self.menubar.setObjectName("menubar")
show_window.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(show_window)
self.statusbar.setObjectName("statusbar")
show_window.setStatusBar(self.statusbar)
self.retranslateUi(show_window)
QtCore.QMetaObject.connectSlotsByName(show_window)
def retranslateUi(self, show_window):
_translate = QtCore.QCoreApplication.translate
show_window.setWindowTitle(_translate("show_window", "MainWindow"))
self.textEdit.setHtml(_translate("show_window", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'SimSun\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p align=\"center\" style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p>\n"
"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:72pt; font-weight:600; color:#ff0000;\">测试勿动</span></p></body></html>"))
二、编写主界面控制程序
1.引入库和主程序,auto_time_screen.py:
# -*- coding: UTF-8 -*-
# 定时截屏工具
import time
import os,logging
from UI.Ui_auto import Ui_MainWindow
from UI.Ui_touming import Ui_show_window
import sys
from PyQt5.QtGui import QIcon,QDesktopServices,QFont # 用于添加图标
from PyQt5.QtWidgets import QApplication,QMainWindow,QFileDialog,QMessageBox,QAction
from PyQt5.QtCore import pyqtSlot,QUrl,Qt
from datetime import datetime, timedelta
import traceback
from thread import RunThread
import threading
import os
import shutil
from configparser import ConfigParser
class show_test(QMainWindow, Ui_show_window):
def __init__(self):
super().__init__() # 使用超类,继承父类的属性及方法
self.setupUi(self) # 构造窗体界面
self.init()
def init(self):
# 设置窗口样式表
self.setStyleSheet("background-color: transparent;")
self.textEdit.setStyleSheet("border:none;")
self.textEdit.setFixedWidth(1900) # 设置TextEdit的宽度为200像素
self.textEdit.setFont(QFont("宋体",100)) #//设置字体和字体大小
# 无边框
self.setWindowFlags(Qt.FramelessWindowHint)
# self.setWindowOpacity(1) #设置透明度
self.setAttribute(Qt.WA_TranslucentBackground) # 设置透明
self.setWindowFlag(Qt.WindowStaysOnTopHint, True) # 置顶
def read_config(self):
cp = ConfigParser()
cp.read("./show_zi.ini",encoding="utf-8")
# print(cp.items("config")) # 获取cmd节点下的所有键值对
# print(cp.sections()) # 获取所有的节点
shuju = cp.get("config", "shuju")
print(cp.get("config", "shuju")) # 获取platformName的值
self.textEdit.setText("<font color=\"#FF0000\">{}</font> ".format(shuju))
self.setCentralWidget(self.textEdit)
class Auto_screen(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__() # 使用超类,继承父类的属性及方法
self.setupUi(self) # 构造窗体界面
self.setWindowIcon(QIcon("./IMG/icon.jpg"))
self.setWindowTitle("定时截屏工具V1.0 ") # 设置窗体主体
self.intUI()
def intUI(self):
# 初始化操作
self.show_time()
self.menu_add()
self.shows = show_test()
def show_time(self):
self.get_time_thread()
self.lineEdit_2.setReadOnly(True)
self.lineEdit_3.setReadOnly(True)
self.comboBox.setEditable(True)
path = os.getcwd() + "/保存/定时截图"
if not os.path.isdir(path):
os.makedirs(path)
self.lineEdit.setText(path)
self.comboBox.insertItem(0,"0.02")
self.comboBox.setCurrentIndex(0)
# 添加打开本地文件夹按钮
def menu_add(self):
add_opeen= QAction("打开",self)
add_opeen.setShortcut('Ctrl+F')
add_opeen.triggered.connect(self.open_local_file)
# self.menu在本地QT内已经创建
self.menu.addAction(add_opeen)
add_opeen1= QAction("删除定时图片文件",self)
add_opeen1.setShortcut('Ctrl+D')
add_opeen1.triggered.connect(self.delate_local_file)
self.menu.addAction(add_opeen1)
# 添加菜单
edit_menu = self.menubar.addMenu('工具')
self.add_opeens= QAction("截图启动时最小化",self)
self.add_opeens.setCheckable(True)
# add_opeens.triggered.connect(self.restartApp)
edit_menu.addAction(self.add_opeens)
self.add_chushiahu = QAction("初始化",self)
self.add_chushiahu.triggered.connect(self.chushihua_anniu)
# add_opeens.triggered.connect(self.restartApp)
edit_menu.addAction(self.add_chushiahu)
self.add_jietu = QAction("全屏截图",self)
self.add_jietu.triggered.connect(self.jietu_all)
# add_opeens.triggered.connect(self.restartApp)
edit_menu.addAction(self.add_jietu)
self.add_show = QAction("显示字样",self)
self.add_show.setCheckable(True)
self.add_show.triggered.connect(self.show_ziti)
# add_opeens.triggered.connect(self.restartApp)
edit_menu.addAction(self.add_show)
self.add_autoanniu = QAction("循环截图",self)
self.add_autoanniu.setCheckable(True)
self.add_autoanniu.triggered.connect(self.circle)
# add_opeens.triggered.connect(self.restartApp)
edit_menu.addAction(self.add_autoanniu)
# 循环截图
def circle(self):
try:
if self.add_autoanniu.isChecked():
if self.add_opeens.isChecked():
self.showMinimized()
self.append_text(color="blue",result="开始循环截图...")
test = threading.Thread(target=self.test_02,args="")
test.start()
else:
print("结束流程!")
self.thread_1.stop_auto_screen()
self.pushButton_2.setEnabled(True)
self.append_text(color="blue",result="循环截图停止!")
except Exception as error:
print(error)
# 执行循环截图
def circle_zhixing(self):
self.pushButton_2.setEnabled(False)
# 获取时间
times_a = self.lineEdit_2.text()
print(times_a)
pass
# 获取循环时间
tims_add = self.comboBox.currentText() # 单位小时
self.thread_1 = RunThread(parent="circle_time",msg=[times_a,tims_add])
self.thread_1.trigger.connect(self.send_information)
self.thread_1.start()
# 显示字样
def show_ziti(self):
if self.add_show.isChecked():
self.shows.read_config()
self.shows.show()
else:
self.shows.close()
# 关闭响应事件
def closeEvent(self, event):
if self.add_show.isChecked():
self.shows.close()
# 删除定时截图图片
def delate_local_file(self):
path = os.getcwd() + "/保存/定时截图"
shutil.rmtree(path)
os.mkdir(path)
self.append_text(color="blue",result="定时截图图片删除成功!")
# 打开本地文件夹
def open_local_file(self):
path = os.getcwd()
QDesktopServices.openUrl(QUrl.fromLocalFile(path))
# 日志管理
def save_log(self):
# 1.创建一个logger(日志记录器)对象;
my_logger = logging.Logger("first_logger")
# 2.定义handler(日志处理器),决定把日志发到哪里;
my_handler = logging.FileHandler('日志.log',encoding='utf-8')
# 3.设置日志级别(level)和输出格式Formatters(日志格式器);
my_handler.setLevel(logging.DEBUG)
my_format = logging.Formatter("时间:%(asctime)s 函数名:%(funcName)s 日志信息:%(message)s 行号:%(lineno)d")
# 把handler添加到对应的logger中去。
my_handler.setFormatter(my_format)
my_logger.addHandler(my_handler)
# 使用:
my_logger.info("程序已启动...")
return my_logger
@pyqtSlot()
def on_pushButton_clicked(self):
self.directory = QFileDialog.getExistingDirectory(self, "选择文件夹", "./")
print(self.directory)
self.lineEdit.setText(self.directory)
def get_time_thread(self):
self.thread_1 = RunThread(parent="get_time",msg=[])
self.thread_1.trigger.connect(self.send_information)
self.thread_1.start()
def get_times(self):
shijian = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
return shijian
def send_information(self,text=[]):
#接收信息
time_now = self.get_times()
if text[0] == "time":
self.lineEdit_2.setText(text[1])
# self.my_logger.info("单曲循环:") startcircle
elif text[0] == "startcircle":
self.circle_zhixing()
elif text[0] == "start_putton":
self.pushButton_2.setEnabled(True)
self.pushButton_2.setText("启动")
elif text[0] == "changd_anniu":
self.control_anniu()
elif text[0] == "info":
self.textBrowser.append(time_now +":" + text[1])
elif text[0] == "green":
self.append_text(color="green",result=text[1])
elif text[0] == "blue":
self.append_text(color="blue",result=text[1])
elif text[0] == "error_save":
self.append_text(color="red",result=text[1])
elif text[0] =="lineEdit_3":
self.lineEdit_3.setText(text[1])
@pyqtSlot()
def on_pushButton_2_clicked(self):
self.thread_1.control_an()
test = threading.Thread(target=self.test_01,args="")
test.start()
# 启用线程
def test_01(self):
path = self.lineEdit.text()
self.thread_1.first_screen(path=path)
result_str = self.set_end_time()
if path == "":
reply = QMessageBox.information(self, "提示", "截图路径未选择!", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
return
self.thread_1.send_path(path=path)
self.thread_1.change_ret(result_str)
# 启用线程
def test_02(self):
path = self.lineEdit.text()
self.thread_1.first_screens(path=path)
result_str = self.set_end_time()
if path == "":
reply = QMessageBox.information(self, "提示", "截图路径未选择!", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
return
self.thread_1.send_path(path=path)
self.thread_1.change_ret(result_str)
# 手动全屏截图
def jietu_all(self):
shijian_get = 0.1
if self.add_opeens.isChecked():
self.showMinimized()
shijian_get = 1
time.sleep(0.5)
self.thread_1.first_screen_click(shijian=shijian_get)
time.sleep(2)
self.showNormal()
# 控制按钮
def control_anniu(self):
if self.add_opeens.isChecked():
self.showMinimized()
self.pushButton_2.setText("定时截图已启动")
self.pushButton_2.setEnabled(False)
self.append_text(color="green",result="启动定时截图...")
# 初始化按钮
def chushihua_anniu(self):
self.append_text(color="blue",result="初始化启动截图按钮...")
self.pushButton_2.setText("启动")
self.pushButton_2.setEnabled(True)
# 打印消息
def append_text(self,color="info",result=""):
time_now = self.get_times()
if color == "info":
self.textBrowser.append(time_now+":"+result)
elif color == "blue":
self.textBrowser.append("<font color=\"#0000FF\">{}:{}</font> ".format(time_now,result))
elif color == "red":
self.textBrowser.append("<font color=\"#FF0000\">{}:{}</font> ".format(time_now,result))
elif color == "green":
self.textBrowser.append("<font color=\"#00FF00\">{}:{}</font> ".format(time_now,result))
def set_end_time(self):
# 设置停止时间
times_a = self.lineEdit_2.text()
print(times_a)
time_a=datetime.strptime(times_a,'%Y-%m-%d %H:%M:%S')
# 获取添加时间
tims_add = self.comboBox.currentText() #单位小时
tims_add = float(tims_add)
if tims_add < 1:
shuju = int(tims_add*60)
self.append_text(color="blue",result="{}分钟后进行截图...".format(shuju))
# 时间相加
result = time_a + timedelta(hours=0, minutes=shuju)
elif tims_add >= 1:
shuju = int(tims_add)
self.append_text(color="blue",result="{}小时后进行截图...".format(shuju))
# 时间相加
result = time_a + timedelta(hours=shuju, minutes=0)
# 将结果转换为字符串
result_str = result.strftime("%Y-%m-%d %H:%M:%S")
# print("相加后的时间:", result_str)
self.lineEdit_3.setText(result_str)
return result_str
if __name__ == "__main__":
app = QApplication(sys.argv)
# 设置应用程序的风格
app.setStyle('Fusion')
w = Auto_screen()
w.show()
sys.exit(app.exec_())
2.编写业务逻辑程序,thread.py:
from genericpath import isdir
from re import T
from tkinter import N
from PyQt5.QtCore import pyqtSignal,QThread
import traceback
import os
import time
import pyautogui
from datetime import datetime, timedelta
#业务线程
class RunThread(QThread):
# 通过类成员对象定义信号对象
# _signal = pyqtSignal(str)
trigger = pyqtSignal(list)
def __init__(self, parent=None,msg=None):
super(RunThread, self).__init__()
self.parent = parent
self.msg = msg
self.end_time = None
self.paths = None
self.ret2 = "biaozhi"
# def __del__(self): #等待
# self.wait()
# 异常处理函数
def yichangchuli(func=None):
def deco(self,*args, **kwargs):
# print(func.__name__) #获取方法名称
try:
res = func(self,*args, **kwargs)
return res
except Exception as error:
error = traceback.format_exc()
print("错误异常:",error)
self.send_emit(change="error_save",result="{}".format(error))
return deco
'''处理业务逻辑'''
@yichangchuli
def run(self):
#识别业务命令,在进行执行
if self.parent == "get_time":
self.get_time_return()
elif self.parent == "circle_time":
self.circle_time_return()
# 定时截图
def get_time_return(self):
while True:
time.sleep(0.1)
shuju = self.get_times()
# print(shuju)
self.send_emit("time",shuju)
if self.paths != None:
# print('等待截图:...')
# 时间进行判断,并截图,保存
if shuju == self.end_time:
# 进行截图
'''
处理屏幕
'''
## 截屏
im = pyautogui.screenshot()
## 保存到本地
name = self.get_time_r()
im.save(self.paths+ "/{}.png".format(name))
self.send_emit("start_putton",result="")
self.send_emit("info",result="最终截图已完成-{}".format(self.paths + "/{}.png".format(name)))
self.paths = None
# 循环时间截图
def circle_time_return(self):
firsime = self.msg[0]
# return
self.ret = True
while self.ret:
self.ret2 = "biaozhi"
self.end_time = self.set_end_time(firstime=firsime,times_add=self.msg[1])
print("结束时间:{}".format(self.end_time))
while True:
time.sleep(0.1)
shuju = self.get_times()
# print(shuju)
self.send_emit("time",shuju)
if self.ret2 != None:
# print('等待截图:...')
# 时间进行判断,并截图,保存
if shuju == self.end_time:
# 进行截图
'''
处理屏幕
'''
## 截屏
im = pyautogui.screenshot()
## 保存到本地
name = self.get_time_r()
im.save(self.paths+ "/{}.png".format(name))
time.sleep(0.8)
im.close()
# self.send_emit("start_putton",result="")
self.send_emit("info",result="截图已完成-{}".format(self.paths + "/{}.png".format(name)))
self.send_emit("green",result="==========================")
firsime = self.end_time
self.send_emit("blue",result="{}分钟后再次进行截图...".format(self.msg[1]))
break
# elif self.ret2 == "stop":
# break
print("结束=======")
# 计算时间
def set_end_time(self,firstime,times_add):
# 设置停止时间
times_a = firstime
time_a=datetime.strptime(times_a,'%Y-%m-%d %H:%M:%S')
# 获取添加时间
tims_add = float(times_add)
if tims_add < 1:
shuju = int(tims_add*60)
# 时间相加
result = time_a + timedelta(hours=0, minutes=shuju)
elif tims_add >= 1:
shuju = int(tims_add)
# 时间相加
result = time_a + timedelta(hours=shuju, minutes=0)
# 将结果转换为字符串
result_str = result.strftime("%Y-%m-%d %H:%M:%S")
# print("相加后的时间:", result_str)
self.send_emit("lineEdit_3",result="{}".format(result_str))
return result_str
# 直接截图
def first_screen(self,path):
time.sleep(2)
im = pyautogui.screenshot()
name = self.get_time_r()
im.save(path + "/{}.png".format(name))
self.send_emit("small_kou",result="")
self.send_emit("info",result="初始截图已完成-{}".format(path + "/{}.png".format(name)))
im.close()
# 直接截图
def first_screens(self,path):
time.sleep(2)
im = pyautogui.screenshot()
name = self.get_time_r()
im.save(path + "/{}.png".format(name))
self.send_emit("small_kou",result="")
self.send_emit("info",result="初始截图已完成-{}".format(path + "/{}.png".format(name)))
im.close()
self.send_emit("startcircle",result="")
# 手动直接截图
def first_screen_click(self,shijian=0.1):
time.sleep(shijian)
path = os.getcwd()
path = path + "./保存/手动全屏截图"
if not os.path.isdir(path):
os.makedirs(path)
im = pyautogui.screenshot()
name = self.get_time_r()
im.save(path + "/{}.png".format(name))
self.send_emit("small_kou",result="")
self.send_emit("info",result="全屏截图已完成-{}".format(path + "/{}.png".format(name)))
def get_times(self):
shijian = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
return shijian
def get_time_r(self):
shijian = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime())
return shijian
def change_ret(self,end_time):
self.end_time = end_time
def send_path(self,path):
self.paths = path
def control_an(self):
self.send_emit("changd_anniu")
def send_emit(self,change="info",result=""):
self.trigger.emit([change, result])
def stop_auto_screen(self):
self.ret = False