PyQt6实战2

cron表达式解析器和生成器

基本功能:

1.输入cron表达式,显示接下来的几条即将执行的时间 (测试下来只有5位是生效的)

2.选择规则生成cron

运行CronRunner即可:

运行效果展示

from PyQt6.QtWidgets import *
import sys
from cron import CronExpression
from generate_cron import GenerateCron

class CronRunner(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.parseUI = CronExpression()
        self.generateUI = GenerateCron()

    def initUI(self):
        self.setWindowTitle('Cron 运行器')
        self.setGeometry(300, 300, 300, 200)

        layout = QVBoxLayout()

        parseBtn = QPushButton('解析 Cron 表达式')
        parseBtn.clicked.connect(self.parseCron)
        layout.addWidget(parseBtn)

        generateBtn = QPushButton('生成 Cron 表达式')
        generateBtn.clicked.connect(self.generateCron)
        layout.addWidget(generateBtn)

        self.setLayout(layout)



    def parseCron(self):
        self.generateUI.hide()
        self.parseUI.show()

    def generateCron(self):
        self.parseUI.hide()
        self.generateUI.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = CronRunner()
    demo.show()
    sys.exit(app.exec())


# cron表达式解析
# 这个croniter用起来感觉好多bug,不知道为啥 文档地址:https://github.com/kiorky/croniter
# 可能是我不会用,还是规则和正常的cron不一样,谁知道的可以评论一下

from PyQt6.QtWidgets import *
import sys
from croniter import croniter, CroniterBadCronError, CroniterNotAlphaError
from datetime import datetime

class CronExpression(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Cron Expression Parser')
        self.setGeometry(300, 300, 500, 400)

        head = QGridLayout()
        self.input_label = QLabel('Cron 表达式:', self)
        self.input = QLineEdit()
        self.time_label = QLabel('时间:', self)
        self.time_input = QLineEdit()
        head.addWidget(self.input_label, 0, 0)
        head.addWidget(self.input, 0, 1)
        head.addWidget(self.time_label, 1, 0)
        head.addWidget(self.time_input, 1, 1)


        ops = QHBoxLayout()
        self.match_button = QPushButton('匹配', self)
        self.match_button.clicked.connect(self.matchCron)
        self.parse_button = QPushButton('查看最近即将执行的几条时间', self)
        self.parse_button.clicked.connect(self.parseCron)
        ops.addWidget(self.match_button)
        ops.addWidget(self.parse_button)
        self.output= QTextEdit()
        
        body = QVBoxLayout()
        body.addLayout(head)
        body.addLayout(ops)
        body.addWidget(self.output)

        self.setLayout(body)


    def parseCron(self):
        input_text = self.input.text()
        self.output.clear()
        
        try:
            cron = croniter(input_text, datetime.now())
            for i in range(5):
                next_time = cron.get_next(datetime)
                self.output.append(f"下一次执行时间: {next_time} \n")
        except CroniterNotAlphaError as e:
            self.output.setText("不兼容的表达式")
        except CroniterBadCronError as e:
            self.output.setText("表达式有问题")


    def matchCron(self):
        input_text = self.input.text()
        time_str = self.time_input.text()
        self.output.clear()
        try:
            time = datetime.strptime(time_str.strip(), '%Y-%m-%d %H:%M:%S')
            is_match = croniter.match(input_text, time)
            self.output.setText(f"时间 {time_str} 是否匹配: {is_match}")
        except ValueError as e:
            self.output.setText("时间格式错误")
        

    

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = CronExpression()
    demo.show()
    sys.exit(app.exec())


    
from PyQt6.QtWidgets import *
from PyQt6.QtGui import *
from PyQt6.QtCore import *
import sys
from datetime import datetime



class GenerateCron(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
        

    def initUI(self):
        self.setWindowTitle('Generate Cron')
        self.setGeometry(100, 100, 500, 400)
        self.setCentralWidget(QTextEdit())
        self.setWindowIcon(QIcon('../../img/json.png'))

        
        menuBar = self.menuBar()
        #这个方法必须调,否则在mac上出不来
        menuBar.setNativeMenuBar(False)

        s = QAction('秒', self)
        s.triggered.connect(self.showSecond)
        m = QAction('分钟', self)
        m.triggered.connect(self.showMinute)
        h = QAction('小时', self)
        h.triggered.connect(self.showHour)
        d = QAction('天', self)
        d.triggered.connect(self.showDay)
        mon = QAction('月', self)
        mon.triggered.connect(self.showMonth)
        menuBar.addAction(s)
        menuBar.addAction(m)
        menuBar.addAction(h)
        menuBar.addAction(d)
        menuBar.addAction(mon)

        self.parseLayout = QHBoxLayout()
        self.parseBtn = QPushButton('生成')
        self.parseBtn.clicked.connect(self.parse)
        self.parseRes = QLineEdit()
        self.parseLayout.addWidget(self.parseBtn)
        self.parseLayout.addWidget(self.parseRes)
        self.parseLayout.setAlignment(Qt.AlignmentFlag.AlignLeft)
        
        self.second = Second()
        self.minute = Minute()
        self.hour = Hour()
        self.day = Day()
        self.month = Month()
        self.stackWidget = QStackedWidget()
        self.stackWidget.addWidget(self.second)
        self.stackWidget.addWidget(self.minute)
        self.stackWidget.addWidget(self.hour)
        self.stackWidget.addWidget(self.day)
        self.stackWidget.addWidget(self.month)


        self.center = QWidget()
        self.centerLayout = QVBoxLayout()
        self.centerLayout.addWidget(self.stackWidget)
        self.centerLayout.addLayout(self.parseLayout)
        self.center.setLayout(self.centerLayout)

        self.setCentralWidget(self.center)



    def showSecond(self):
        self.stackWidget.setCurrentIndex(0)
    
    def showMinute(self):
        self.stackWidget.setCurrentIndex(1)

    def showHour(self):
        self.stackWidget.setCurrentIndex(2)

    def showDay(self):
        self.stackWidget.setCurrentIndex(3)

    def showMonth(self):
        self.stackWidget.setCurrentIndex(4)

    def parse(self):
        self.parseRes.setText(self.getCronExpression())


    def getCronExpression(self):
        s = self.second.getCron()
        m = self.minute.getCron()
        h = self.hour.getCron()
        d = self.day.getCron()
        m = self.month.getCron()
        return f"{s} {m} {h} {d} {m}" 


'''
定义cron展示的抽象类
样式来自:https://cron.qqe2.com/
'''
class AbstractCronUI(QWidget):
    def __init__(self):
        super().__init__()
        self.key = self.getKey()
        self.initUI()

    def getKey(self):
        pass
    
    def initUI(self):
        self.customize_checkbox = []
        self.setWindowTitle('cron表达式生成器')

        self.setGeometry(100, 100, 500, 300)
        layout = QVBoxLayout()

        perLayout = QHBoxLayout()
        self.per = QRadioButton()
        self.per.setChecked(True)
        perLabel = QLabel(f'每{self.key} 允许的通配符[, - * /]')
        perLayout.addWidget(self.per)
        perLayout.addWidget(perLabel)
        perLayout.setAlignment(Qt.AlignmentFlag.AlignLeft)

        periodLayout = QHBoxLayout()
        self.period = QRadioButton()
        periodLabel1 = QLabel('周期 从')
        self.periodInput1 = QLineEdit()
        periodLabel2 = QLabel('-')
        self.periodInput2 = QLineEdit()
        periodLabel3 = QLabel(f'{self.key}')
        periodLayout.addWidget(self.period)
        periodLayout.addWidget(periodLabel1)
        periodLayout.addWidget(self.periodInput1)
        periodLayout.addWidget(periodLabel2)
        periodLayout.addWidget(self.periodInput2)
        periodLayout.addWidget(periodLabel3)
        periodLayout.setAlignment(Qt.AlignmentFlag.AlignLeft)

        spanLayout = QHBoxLayout()
        self.span = QRadioButton()
        spanLabel1 = QLabel('从')
        self.spanInput1 = QLineEdit()
        spanLabel2 = QLabel(f'{self.key}开始,每')
        self.spanInput2 = QLineEdit()
        spanLabel3 = QLabel(f'{self.key}执行一次')
        spanLayout.addWidget(self.span)
        spanLayout.addWidget(spanLabel1)
        spanLayout.addWidget(self.spanInput1)
        spanLayout.addWidget(spanLabel2)
        spanLayout.addWidget(self.spanInput2)
        spanLayout.addWidget(spanLabel3)
        spanLayout.setAlignment(Qt.AlignmentFlag.AlignLeft)

        customizeLayout = QHBoxLayout()
        self.customizeBtn = QRadioButton()
        customizeLabel = QLabel('指定')
        customizeLayout.addWidget(self.customizeBtn)
        customizeLayout.addWidget(customizeLabel)
        customizeLayout.setAlignment(Qt.AlignmentFlag.AlignLeft)

        girdlayout = self.customize()

        layout.addLayout(perLayout)
        layout.addLayout(periodLayout)
        layout.addLayout(spanLayout)
        layout.addLayout(customizeLayout)
        layout.addLayout(girdlayout)
        self.setLayout(layout)

    def customize(self):
        pass

    def getCron(self):
        if(self.per.isChecked()):
            return "*"
        elif(self.period.isChecked()):
            pi1 = self.periodInput1.text()
            pi2 = self.periodInput2.text()
            return pi1 + "-" + pi2
        elif(self.span.isChecked()):
            si1 = self.spanInput1.text()
            si2 = self.spanInput2.text()
            return si1 + "/" + si2
        elif(self.customizeBtn.isChecked()):
            cron = ""
            for i in range(self.customize_checkbox.length):
                if(self.customize_checkbox[i].isChecked()):
                    cron += str(i) + ","
            return cron[:-1]
        return ""
    

class Second(AbstractCronUI):
    def __init__(self):
        super().__init__()
        

    def getKey(self):
        return "秒"

    def customize(self):
        self.girdlayout = QGridLayout()
        for i in range(60):
            c0 = QCheckBox()
            l0 = QLabel(str(i))
            self.girdlayout.addWidget(c0,i//10,i%10 * 2)
            self.girdlayout.addWidget(l0,i//10,i%10 * 2 + 1)

            self.customize_checkbox.append(c0)
        return self.girdlayout
    


class Minute(AbstractCronUI):
    def __init__(self):
        super().__init__()
        
    def getKey(self):
        return "分钟"

    def customize(self):
        girdlayout = QGridLayout()
        for i in range(60):
            c0 = QCheckBox()
            l0 = QLabel(str(i))
            girdlayout.addWidget(c0,i//10,i%10 * 2)
            girdlayout.addWidget(l0,i//10,i%10 * 2 + 1)
            self.customize_checkbox.append(c0)
        return girdlayout


class Hour(AbstractCronUI):
    def __init__(self):
        super().__init__()
    
    def getKey(self):
        return "小时"
    
    def customize(self):
        girdlayout = QGridLayout()
        for i in range(24):
            c0 = QCheckBox()
            l0 = QLabel(str(i))
            girdlayout.addWidget(c0,i//12,i%12 * 2)
            girdlayout.addWidget(l0,i//12,i%12 * 2 + 1)
            self.customize_checkbox.append(c0)
        return girdlayout
    


class Day(AbstractCronUI):
    def __init__(self):
        super().__init__()

    def getKey(self):
        return "日"

    def customize(self):
        girdlayout = QGridLayout()
        for i in range(31):
            c0 = QCheckBox()
            l0 = QLabel(str(i + 1))
            girdlayout.addWidget(c0,i//7,i%7 * 2)
            girdlayout.addWidget(l0,i//7,i%7 * 2 + 1)
            self.customize_checkbox.append(c0)
        return girdlayout


class Month(AbstractCronUI):
    def __init__(self):
        super().__init__()

    def getKey(self):
        return "月"
    
    def customize(self):
        girdlayout = QGridLayout()
        for i in range(12):
            c0 = QCheckBox()
            l0 = QLabel(str(i + 1))
            girdlayout.addWidget(c0,i//12,i%12 * 2)
            girdlayout.addWidget(l0,i//12,i%12 * 2 + 1)
        return girdlayout



if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = GenerateCron()
    demo.show()
    sys.exit(app.exec())

代码地址

GitHub - chunlaiqingke/Tiny-Tool

公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/465470.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RuoYi-Vue开源项目2-前端登录验证码生成过程分析

前端登录验证码实现过程 生成过程分析 生成过程分析 验证码的生成过程简单概括为:前端登录页面加载时,向后端发送一个请求,返回验证码图片给前端页面展示 前端页面加载触发代码: import { getCodeImg } from "/api/login&q…

在pharmit里匹配药效团

我把400个无活性的小分子(decoys)提交到pharmit里。 命名为decoyset00~decoyset08,查找时,按这个找。 1、导入药效团配体: 进入药效团筛选界面: 导入代表药效团模型的活性肽构象: 2、选择预先…

Unity判断某个材质是否拥有某张贴图

在Unity中,一个材质是唯一的,也就是实例,当我们打开Debug面板时,就可以看清楚材质的具体信息。 其中SvaedProperties就是材质保存的属性,当然贴图也是属性,也就是TexEnvs下的属性 当然,要判断某…

Docker进阶教程 - 2 Docker部署SpringBoot项目

更好的阅读体验:点这里 ( www.doubibiji.com ) 2 Docker部署SpringBoot项目 已经学习了 Dockerfile 了,下面介绍一下如何将 SpringBoot 项目通过 Dockerfile 来部署到 Docker 中。 1 修改项目配置 首先需要准备一个 SpringBo…

【Spring 篇】SpringMVC的请求:舞台上的开端

在Web开发的舞台上,请求就如同一场充满激情的开端,而SpringMVC是这场表演的舞台主持人,它能够优雅地接收和处理各种请求,引领我们进入一个美妙的编码之旅。在本篇博客中,我们将深入探讨SpringMVC的请求处理机制&#x…

oracle 19c打补丁到19.14

oracle 19c打补丁到19.14 oracle 19.3打补丁到19.14 查看oracle的版本: SQL> column product format A30 SQL> column version format A15 SQL> column version_full format A20 SQL> column status format A15 SQL> select * from product_compo…

鸿蒙开发之MPChart图表开发

一、简介 随着移动应用的不断发展,数据可视化成为提高用户体验和数据交流的重要手段之一,因此需要经常使用图表,如折线图、柱形图等。OpenHarmony提供了一个强大而灵活的图表库是实现这一目标的关键。 在 ohpm 中心仓(https://ohpm.openharmony.cn/)中,汇聚了众多开发者…

3月报价:腾讯云服务器2024年优惠价格表,5元1个月

腾讯云服务器今日价格:轻量应用服务器2核2G3M价格61元一年、2核2G4M价格99元一年,540元三年、2核4G5M带宽165元一年,2核4G5M带宽756元三年、轻量4核8G12M服务器646元15个月;云服务器CVM S5实例2核2G配置280.8元一年、2核4G、4核8G…

常用芯片学习——DS3231M芯片

DS3231M RTC实时时钟 芯片介绍 DS3231M是一款低成本、极其精确的 I2C 实时时钟 (RTC)。该设备集成了电池输入,并在设备主电源中断时保持准确的计时。微型电子机械系统 (MEMS) 谐振器的集成提高了器件的长期精度&…

CesiumJS 沙盒

CesiumJS 沙盒 通过CesiumJS 沙盒快速测试CesiumJS的一些功能,免去安装开发环境的困恼。 Hello World https://sandcastle.cesium.com/index.html 简单修改(F8运行):去掉界面上UI const viewer new Cesium.Viewer("cesi…

HBase在表操作--显示中文

启动HBase后,Master和RegionServer两个服务器,分别对应进程为HMaster和HRegionServe。(可通过jps查看) 1.进入表操作 hbase shell 2.查看当前库中存在的表 list 3.查看表中数据(注:学习期间可用&#…

ve-list 列表

ve-list 列表 功能描述 最基础的列表展示&#xff0c;可承载文字、列表、图片、段落&#xff0c;常用于后台数据展示页面。 Api 效果图 <ve-list v-for"(item, index) in _list" :key"index" :data"item" type"list3"><t…

谷歌(edge)浏览器过滤,只查看后端发送的请求

打开F12 调试工具 选择Network 这是我们会发现 什么图片 文件 接口的请求很多很多&#xff0c;我们只需要查看我们后端发送的请求是否成功就好了 正常情况我们需要的都是只看接口 先点击这里这个 过滤 我们只需要点击 Fetch/XHR 即可过滤掉其他请求信息的展示 这样烦恼的问题就…

HDFS EXERCISES

bash: hdfs: command not found...这可能是因为hdfs命令不在系统环境变量中 whereis hadoop 找到hadoop的位置 一旦找到Hadoop安装目录&#xff0c;您需要将其 bin 目录添加到PATH环境变量中。 vi ~/.bashrc .bashrc 是一个在Linux和Unix系统中用于Bash shell的配置文件。当…

Python图像处理指南:PIL与OpenCV的比较【第136篇—PIL】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python图像处理指南&#xff1a;PIL与OpenCV的比较 图像处理在计算机视觉和图像识别等领域…

[氮化镓]GaN中质子反冲离子的LET和射程特性

这篇文件是一篇关于氮化镓&#xff08;GaN&#xff09;中质子反冲离子的线性能量转移&#xff08;LET&#xff09;和射程特性的研究论文&#xff0c;发表在《IEEE Transactions on Nuclear Science》2021年5月的期刊上。论文的主要内容包括&#xff1a; 研究背景&#xff1a;氮…

Python的网络爬虫介绍与实战

Python的网络爬虫基础介绍与实战 定义流程包和函数静动态网页爬虫实战红牛分公司&#xff1f;二手房数据&#xff08;静态网页&#xff09;豆瓣读书&#xff08;动态网页&#xff09; 定义 网络爬虫是按照一定的规则&#xff0c;自动地抓取万维网&#xff08;www&#xff09;信…

Java代码审计安全篇-XXE(XML外部实体注入)漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计&#xff0c;记录自己的学习过程&#xff0c;还希望各…

sql join

-- 创建事实表 CREATE TABLE product_facts (id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(255),price DECIMAL(10, 2) );-- 插入数据 INSERT INTO product_facts (product_name, price) VALUES (Product A, 100.00); INSERT INTO product_facts (product_name, pr…

【MySQL】MySQL事务

文章目录 一、CURD不加控制&#xff0c;会有什么问题&#xff1f;二、事务的概念三、事务出现的原因四、事务的版本支持五、事务提交方式六、事务常见操作方式七、事务隔离级别1.理解隔离性12.隔离级别3.查看与设置隔离性4.读未提交【Read Uncommitted】5.读提交【Read Committ…