目录
一、引言
在数字化转型加速的今天,自动化执行程序已成为提升工作效率的关键技术。Python凭借其简洁灵活的语法和丰富的生态库,成为开发定时任务工具的首选语言;而PyQt作为成熟的跨平台GUI框架,则为工具提供了直观的用户交互界面。将二者结合构建的自动化定时任务执行器,不仅能实现精准的任务触发与循环控制,还能通过可视化配置降低使用门槛。
二、GUI界面设计
使用PyQt5进行界面的搭建,界面如下:
初始界面搭建采用极简风格。用户通过点击“上传待执行的程序”上传.exe程序文件(自动弹出文件选择对话框),再选择不同的定时方式(详尽:精确到年月日时分秒,均可自定义;粗略:提供3秒后、5秒后、10秒后、30秒后、1分钟后、3分钟后、5分钟后、10分钟后、30分钟后、1小时后多种选项),最后点击“开始倒计时”,即可在实现在指定时间运行指定程序的功能。
1.效果演示
这里以“360浏览器.exe”为实例,选择相应启动方式,若时间未过期,点击“开始倒计时”,即可在对应时间到达后自动打开360浏览器。
2.相关提示
若未上传.exe可执行文件,直接点击“开始倒计时”,会有以下提示。
若未设置时间(两种方式任选其一),直接点击“开始倒计时”,会有以下提示。
若设置时间符合要求,直接点击“开始倒计时”,会有以下提示。
针对“详尽”方式,尤其要把握精确时间,若自定义的时间小于当前时间,则程序不能成功执行,且会有以下提示。
3.界面设计.py
通过pyuic5产生的GUI界面代码UI_Main.py如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'UI_main.ui'
#
# Created by: PyQt5 UI code generator 5.15.11
#
# 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 Main_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.setEnabled(True)
Form.resize(400, 500)
Form.setMinimumSize(QtCore.QSize(400, 500))
Form.setMaximumSize(QtCore.QSize(400, 500))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":/image1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
Form.setWindowIcon(icon)
self.label_5 = QtWidgets.QLabel(Form)
self.label_5.setGeometry(QtCore.QRect(230, 70, 141, 31))
font = QtGui.QFont()
font.setFamily("Adobe Arabic")
font.setPointSize(16)
self.label_5.setFont(font)
self.label_5.setObjectName("label_5")
self.label_8 = QtWidgets.QLabel(Form)
self.label_8.setGeometry(QtCore.QRect(80, 10, 261, 61))
font = QtGui.QFont()
font.setFamily("字魂5号-无外润黑体")
font.setPointSize(26)
font.setBold(False)
font.setWeight(50)
self.label_8.setFont(font)
self.label_8.setObjectName("label_8")
self.label_10 = QtWidgets.QLabel(Form)
self.label_10.setGeometry(QtCore.QRect(310, 60, 71, 51))
self.label_10.setText("")
self.label_10.setPixmap(QtGui.QPixmap(":/image1.png"))
self.label_10.setObjectName("label_10")
self.label_3 = QtWidgets.QLabel(Form)
self.label_3.setGeometry(QtCore.QRect(20, 210, 181, 21))
font = QtGui.QFont()
font.setFamily("新宋体")
font.setPointSize(12)
self.label_3.setFont(font)
self.label_3.setObjectName("label_3")
self.pushButton_2 = QtWidgets.QPushButton(Form)
self.pushButton_2.setGeometry(QtCore.QRect(80, 400, 291, 23))
font = QtGui.QFont()
font.setFamily("新宋体")
self.pushButton_2.setFont(font)
self.pushButton_2.setObjectName("pushButton_2")
self.label_4 = QtWidgets.QLabel(Form)
self.label_4.setGeometry(QtCore.QRect(150, 288, 21, 21))
font = QtGui.QFont()
font.setFamily("新宋体")
self.label_4.setFont(font)
self.label_4.setObjectName("label_4")
self.comboBox = QtWidgets.QComboBox(Form)
self.comboBox.setGeometry(QtCore.QRect(90, 288, 61, 22))
font = QtGui.QFont()
font.setFamily("新宋体")
self.comboBox.setFont(font)
self.comboBox.setObjectName("comboBox")
self.label_6 = QtWidgets.QLabel(Form)
self.label_6.setGeometry(QtCore.QRect(250, 288, 21, 21))
font = QtGui.QFont()
font.setFamily("新宋体")
self.label_6.setFont(font)
self.label_6.setObjectName("label_6")
self.comboBox_2 = QtWidgets.QComboBox(Form)
self.comboBox_2.setGeometry(QtCore.QRect(190, 288, 61, 22))
font = QtGui.QFont()
font.setFamily("新宋体")
self.comboBox_2.setFont(font)
self.comboBox_2.setObjectName("comboBox_2")
self.label_7 = QtWidgets.QLabel(Form)
self.label_7.setGeometry(QtCore.QRect(350, 290, 16, 20))
font = QtGui.QFont()
font.setFamily("新宋体")
self.label_7.setFont(font)
self.label_7.setObjectName("label_7")
self.radioButton = QtWidgets.QRadioButton(Form)
self.radioButton.setGeometry(QtCore.QRect(20, 250, 51, 21))
font = QtGui.QFont()
font.setFamily("新宋体")
self.radioButton.setFont(font)
self.radioButton.setObjectName("radioButton")
self.radioButton_2 = QtWidgets.QRadioButton(Form)
self.radioButton_2.setGeometry(QtCore.QRect(20, 350, 51, 21))
font = QtGui.QFont()
font.setFamily("新宋体")
self.radioButton_2.setFont(font)
self.radioButton_2.setObjectName("radioButton_2")
self.comboBox_4 = QtWidgets.QComboBox(Form)
self.comboBox_4.setGeometry(QtCore.QRect(90, 350, 261, 22))
font = QtGui.QFont()
font.setFamily("新宋体")
self.comboBox_4.setFont(font)
self.comboBox_4.setObjectName("comboBox_4")
self.comboBox_4.addItem("")
self.comboBox_4.addItem("")
self.comboBox_4.addItem("")
self.comboBox_4.addItem("")
self.comboBox_4.addItem("")
self.comboBox_4.addItem("")
self.comboBox_4.addItem("")
self.comboBox_4.addItem("")
self.comboBox_4.addItem("")
self.comboBox_4.addItem("")
self.comboBox_4.addItem("")
self.comboBox_3 = QtWidgets.QComboBox(Form)
self.comboBox_3.setGeometry(QtCore.QRect(290, 288, 61, 22))
font = QtGui.QFont()
font.setFamily("新宋体")
self.comboBox_3.setFont(font)
self.comboBox_3.setObjectName("comboBox_3")
self.pushButton_4 = QtWidgets.QPushButton(Form)
self.pushButton_4.setGeometry(QtCore.QRect(80, 440, 291, 23))
font = QtGui.QFont()
font.setFamily("新宋体")
self.pushButton_4.setFont(font)
self.pushButton_4.setObjectName("pushButton_4")
self.label_9 = QtWidgets.QLabel(Form)
self.label_9.setGeometry(QtCore.QRect(80, 240, 291, 81))
self.label_9.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.label_9.setText("")
self.label_9.setObjectName("label_9")
self.label_11 = QtWidgets.QLabel(Form)
self.label_11.setGeometry(QtCore.QRect(80, 340, 291, 41))
self.label_11.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.label_11.setText("")
self.label_11.setObjectName("label_11")
self.label_13 = QtWidgets.QLabel(Form)
self.label_13.setGeometry(QtCore.QRect(20, 120, 201, 21))
font = QtGui.QFont()
font.setFamily("新宋体")
font.setPointSize(12)
self.label_13.setFont(font)
self.label_13.setObjectName("label_13")
self.pushButton_5 = QtWidgets.QPushButton(Form)
self.pushButton_5.setGeometry(QtCore.QRect(80, 150, 291, 23))
font = QtGui.QFont()
font.setFamily("新宋体")
self.pushButton_5.setFont(font)
self.pushButton_5.setObjectName("pushButton_5")
self.comboBox_5 = QtWidgets.QComboBox(Form)
self.comboBox_5.setGeometry(QtCore.QRect(90, 250, 61, 22))
font = QtGui.QFont()
font.setFamily("新宋体")
self.comboBox_5.setFont(font)
self.comboBox_5.setObjectName("comboBox_5")
self.label_14 = QtWidgets.QLabel(Form)
self.label_14.setGeometry(QtCore.QRect(150, 250, 21, 21))
font = QtGui.QFont()
font.setFamily("新宋体")
self.label_14.setFont(font)
self.label_14.setObjectName("label_14")
self.comboBox_6 = QtWidgets.QComboBox(Form)
self.comboBox_6.setGeometry(QtCore.QRect(190, 250, 61, 22))
font = QtGui.QFont()
font.setFamily("新宋体")
self.comboBox_6.setFont(font)
self.comboBox_6.setObjectName("comboBox_6")
self.label_15 = QtWidgets.QLabel(Form)
self.label_15.setGeometry(QtCore.QRect(250, 250, 21, 21))
font = QtGui.QFont()
font.setFamily("新宋体")
self.label_15.setFont(font)
self.label_15.setObjectName("label_15")
self.label_16 = QtWidgets.QLabel(Form)
self.label_16.setGeometry(QtCore.QRect(350, 250, 21, 21))
font = QtGui.QFont()
font.setFamily("新宋体")
self.label_16.setFont(font)
self.label_16.setObjectName("label_16")
self.comboBox_7 = QtWidgets.QComboBox(Form)
self.comboBox_7.setGeometry(QtCore.QRect(290, 250, 61, 22))
font = QtGui.QFont()
font.setFamily("新宋体")
self.comboBox_7.setFont(font)
self.comboBox_7.setObjectName("comboBox_7")
self.label_11.raise_()
self.label_9.raise_()
self.label_5.raise_()
self.label_8.raise_()
self.label_10.raise_()
self.label_3.raise_()
self.pushButton_2.raise_()
self.label_4.raise_()
self.comboBox.raise_()
self.label_6.raise_()
self.comboBox_2.raise_()
self.label_7.raise_()
self.radioButton.raise_()
self.radioButton_2.raise_()
self.comboBox_4.raise_()
self.comboBox_3.raise_()
self.pushButton_4.raise_()
self.label_13.raise_()
self.pushButton_5.raise_()
self.comboBox_5.raise_()
self.label_14.raise_()
self.comboBox_6.raise_()
self.label_15.raise_()
self.label_16.raise_()
self.comboBox_7.raise_()
self.retranslateUi(Form)
self.pushButton_4.clicked.connect(Form.close) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Timer_exe"))
self.label_5.setText(_translate("Form", "Designed By"))
self.label_8.setText(_translate("Form", "程序定时执行器"))
self.label_3.setText(_translate("Form", "二、设置程序启动时间"))
self.pushButton_2.setText(_translate("Form", "开始倒计时"))
self.label_4.setText(_translate("Form", "时"))
self.label_6.setText(_translate("Form", "分"))
self.label_7.setText(_translate("Form", "秒"))
self.radioButton.setText(_translate("Form", "详尽"))
self.radioButton_2.setText(_translate("Form", "粗略"))
self.comboBox_4.setItemText(0, _translate("Form", "请选择"))
self.comboBox_4.setItemText(1, _translate("Form", "3秒后"))
self.comboBox_4.setItemText(2, _translate("Form", "5秒后"))
self.comboBox_4.setItemText(3, _translate("Form", "10秒后"))
self.comboBox_4.setItemText(4, _translate("Form", "30秒后"))
self.comboBox_4.setItemText(5, _translate("Form", "1分钟后"))
self.comboBox_4.setItemText(6, _translate("Form", "3分钟后"))
self.comboBox_4.setItemText(7, _translate("Form", "5分钟后"))
self.comboBox_4.setItemText(8, _translate("Form", "10分钟后"))
self.comboBox_4.setItemText(9, _translate("Form", "30分钟后"))
self.comboBox_4.setItemText(10, _translate("Form", "1个小时后"))
self.pushButton_4.setText(_translate("Form", "退出系统"))
self.label_13.setText(_translate("Form", "一、选择定时执行程序"))
self.pushButton_5.setText(_translate("Form", "选择待执行的程序"))
self.label_14.setText(_translate("Form", "年"))
self.label_15.setText(_translate("Form", "月"))
self.label_16.setText(_translate("Form", "日"))
import ziyuan_rc
三、主要程序详解
1.导入相关模块
import sys, time, os
from UI_main import *
from PyQt5.QtWidgets import QApplication, QWidget
# 保持窗口大小和qtdesigner中的一致
from PyQt5 import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
time模块与时间设置有关;os模块与启动运行程序文件有关;UI_main是界面设计文件; 不懂为啥需要导入Qtcore的,请看