Python自动化(8)——pyqt5界面

news2024/11/18 15:46:55

Python自动化(8)——pyqt5界面

注意:pyqt5的界面使用时必须有app = QApplication(sys.argv)这行代码,否则会出现错误并且无法显示窗口:QWidget: Must construct a QApplication before a QWidget

一些基础的控件

QMainWindow

QMainWindow是PyQt5中一个重要的类,它提供了一个主窗口的框架,可以包含菜单栏、工具栏、状态栏以及中心部件等。
常用的方法有:
setMenuBar(self, QMenuBar): 设置菜单栏。
menuBar(self) -> QMenuBar: 获取菜单栏。
addToolBar(self, QToolBar): 添加工具栏。
statusBar(self) -> QStatusBar: 获取状态栏。
setStatusBar(self, QStatusBar): 设置状态栏。
setCentralWidget(self, QWidget): 设置中心部件。
centralWidget(self) -> QWidget: 获取中心部件。
addDockWidget(self, Qt.DockWidgetArea, QDockWidget): 添加停靠窗口。

QtCore.pyqtSignal

pyqtSignal是PyQt5中用于定义和发射信号的类。信号是Qt框架中事件驱动机制的核心部分,通过信号和槽机制,可以在对象之间进行通信。
下面的例子中,就使用了pyqtSignal实现日志的显示。

QTabWidget

QTabWidget是PyQt5中用于创建选项卡界面的一个控件。

QWidget

QWidget是PyQt5中所有用户界面对象的基类,它提供了一个窗口部件的基本功能,并且可以作为一个容器来包含其它窗口部件。

QHBoxLayout和QVBoxLayout

QHBoxLayout 和 QVBoxLayout 是 PyQt5 中用于管理窗口部件布局的两种常见布局管理器。它们分别用于水平和垂直排列窗口部件。

QPushButton

QPushButton 是 PyQt5 中的一个常用窗口部件,用于创建按钮。

QListWidget和QListWidgetItem

QListWidget 是 PyQt5 中的一个常用窗口部件,用于显示和管理列表项。列表项类就是QListWidgetItem,它可以包含文本、图标、工具提示等信息。

QLabel

QLabel 是 PyQt5 中的一个常用控件,用于显示文本或图像。

QCheckBox

QCheckBox 是 PyQt5 中的一个控件,用于在用户界面中显示一个复选框。用户可以通过点击复选框来选择或取消选择某个选项。QCheckBox 可以用于多选项的选择,也可以用于单选项的开关。

QLineEdit

QLineEdit 是 PyQt5 中的一个控件,用于单行文本输入。它提供了多种方法和属性来处理文本输入、验证、格式化等功能。

以上都是比较常用的pyqt5控件,其实还有部分可重写的方法例如closeEvent,会在窗口关闭时调用,还有许多事件可重写,如下图:
在这里插入图片描述

实现一个简单的pyqt5界面

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout
from PyQt5.QtWidgets import QTabWidget, QPushButton, QListWidget, QLabel, QListWidgetItem
from PyQt5 import QtCore
from threading import Thread

class Window(QMainWindow):
    pysignal = QtCore.pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.taskList = []
        self.logList = []
        self.logIndex = 1
        self.pysignal.connect(self.onCallSignal)

        self.setWindowTitle("简单的pyqt5界面")
        self.setGeometry(100, 100, 800, 600)
        self.tab_widget = QTabWidget()
        self.setCentralWidget(self.tab_widget)
        self.create_login_tab()
        self.create_task_tab()
        self.create_hint_tab()

    def create_login_tab(self):
        login_tab = QWidget()
        layout = QVBoxLayout()
        login_button = QPushButton("登陆")
        layout.addWidget(login_button)
        login_tab.setLayout(layout)
        self.tab_widget.addTab(login_tab, "登陆")

    def create_task_tab(self):
        task_tab = QWidget()
        main_layout = QHBoxLayout()
        left_layout = QVBoxLayout()
        right_layout = QVBoxLayout()
        # Left side layout
        self.taskListView = QListWidget()
        self.logListView = QListWidget()
        left_layout.addWidget(self.taskListView)
        left_layout.addWidget(self.logListView)
        # Right side layout
        create_task_button = QPushButton("创建任务")
        start_task_button = QPushButton("开始任务")
        end_task_button = QPushButton("结束任务")
        delete_task_button = QPushButton("删除任务")
        show_log_button = QPushButton("显示log")
        clear_log_button = QPushButton("清空log")
        create_task_button.clicked.connect(self.createThread)
        start_task_button.clicked.connect(self.startTask)
        end_task_button.clicked.connect(self.stopTask)
        show_log_button.clicked.connect(self.showLog)
        clear_log_button.clicked.connect(self.clearLog)
        right_layout.addWidget(create_task_button)
        right_layout.addWidget(start_task_button)
        right_layout.addWidget(end_task_button)
        right_layout.addWidget(delete_task_button)
        right_layout.addWidget(show_log_button)
        right_layout.addWidget(clear_log_button)
        main_layout.addLayout(left_layout)
        main_layout.addLayout(right_layout)
        task_tab.setLayout(main_layout)
        self.tab_widget.addTab(task_tab, "任务")

    def create_hint_tab(self):
        hint_tab = QWidget()
        layout = QVBoxLayout()
        hint_label = QLabel("本软件仅供学习")
        layout.addWidget(hint_label)
        hint_tab.setLayout(layout)
        self.tab_widget.addTab(hint_tab, "提示")

    def createThread(self):
        index = len(self.taskList)+1
        item = QListWidgetItem('任务'+str(index))
        item.setData(1, index-1)
        self.taskListView.addItem(item)
        task = Task(self.showLog)
        self.taskList.append(task)

    def onCallSignal(self, content):
        item = QListWidgetItem(content)
        self.logListView.addItem(item)
        if self.logListView.currentRow() == self.logListView.count()-2:
            self.logListView.setCurrentRow(self.logListView.count()-1)
            self.logListView.scrollToBottom()

    def showLog(self, content):
        if not content:
            content = str(self.logIndex)
            self.logIndex += 1
        self.pysignal.emit(content)

    def clearLog(self):
        self.logListView.clear()

    def getCurrentIndex(self):
        curItem = self.taskListView.currentItem()
        if curItem:
            index = curItem.data(1)
            return index
        else:
            return -1

    def _startTask(self, index):
        if -1 < index < len(self.taskList):
            self.taskList[index].start()
            self.showLog('开始任务 index: ' + str(index))

    def startTask(self):
        index = self.getCurrentIndex()
        thread = Thread(target=self._startTask,args=(index,))
        thread.start()

    def _stopTask(self, index):
        if -1 < index < len(self.taskList):
            if self.taskList[index].isRunning():
                self.taskList[index].terminate()
                self.showLog('结束任务 index: ' + str(index))

    def stopTask(self):
        index = self.getCurrentIndex()
        thread = Thread(target=self.show)
        thread.start()

class Task(QtCore.QThread):
    def __init__(self, logCallback):
        super().__init__()
        self.callback = logCallback

    def show(self):
        for i in range(10):
            self.callback(str('task running ' + str(i)))
            self.sleep(1)

    def run(self):
        thread = Thread(target=self.show)
        thread.start()

def main():
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

效果:
在这里插入图片描述
这里有一点需要注意,就是开始任务和结束任务等需要一定的时间的操作,我一般都需要使用线程来执行。如果不使用线程执行耗时任务,那么任务有可能会卡住主线程,从而使界面卡死。

完整自动化工程代码:https://gitee.com/chj-self/PythonRobotization

大佬们找到问题欢迎拍砖~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index.…

(1995-2022年) 全国各省份-技术交易活跃度

技术交易活跃度是一个关键指标&#xff0c;用于衡量技术市场的交易频繁程度和活跃性。它不仅显示了市场参与者对技术交易的参与热情&#xff0c;而且交易的频率也体现了市场的活力。这一指标对于不同的利益相关者具有不同的意义&#xff1a; 对投资者而言&#xff0c;技术交易…

尚硅谷k8s

p1-6 阿里云服务器开通流程 阿里云服务器购买等各种操作,省略 p7 私有网络vpc实战 VPC&#xff08;Virtual Private Cloud&#xff09;网络&#xff0c;是一种基于云计算的网络服务&#xff0c;旨在为用户提供在公有云上自定义的、逻辑隔离的网络空间。 设置vpc可以使网络之…

让生产管理变简单

随着业务的发展&#xff0c;工厂每天要处理很多订单&#xff0c;还要统筹安排各部门工作以及协调上下游加工企业&#xff0c;生产管理问题也随之而来。 1.销售订单评审困难、无法及时抓取到历史数据做参考。由于数据的不及时性、不准确性无法为正常的生产和采购提供数据支撑。同…

Linux关闭swap分区操作[适用于CDH报警等]

1.查看swap分区挂载路径(没卵用) swapon -s 2.设置配置文件的swap配置 echo “vm.swappiness 0” > /etc/sysctl.conf 3.设置内存中的swap状态。有时候配置文件为0&#xff0c;但集群或服务仍然使用了swap分区&#xff0c;可能原因就是内存没有同步配置 echo “0” > …

X-AnyLabeling使用教程

1.AI 模型自动分割标注使用教程 2.AI 模型自动目标检测标注使用教程

HTML(23)——垂直对齐方式

垂直对齐方式 属性名&#xff1a;vertical-align 属性值效果baseline基线对齐(默认)top顶部对齐middle居中对齐bottom底部对齐 默认情况下浏览器对行内块&#xff0c;行内标签都按文字处理&#xff0c;默认基线对齐 导致图片看起来会偏上&#xff0c;文字偏下。 示例&#…

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装&#xff0c;可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 &#xff08;1&#xff09;通过position属性,可以控制下拉选项的位置 &am…

安规管理:PLM安规管理、PLM安规管理新策略

安规管理&#xff1a;PLM安规管理、PLM安规管理新策略 随着科技的飞速发展&#xff0c;电子产品已经成为我们生活中不可或缺的一部分。然而&#xff0c;这些产品在给人们带来便利的同时&#xff0c;也可能带来触电、火灾、有害辐射等安全隐患。为了保护消费者的生命财产安全&am…

NSSCTF-Web题目15

目录 [HNCTF 2022 WEEK2]ez_SSTI 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]Ez_upload 1、题目 2、知识点 3、思路 [HNCTF 2022 WEEK2]ez_SSTI 1、题目 2、知识点 SSTI、Jinja2 参考链接&#xff1a;1. SSTI&#xff08;模板注入&#xff09;漏洞&#xff08;…

雨量传感器的分类和选型建议

物理原理分类 机械降雨量计&#xff08;雨量桶&#xff09;&#xff1a;最早使用的降雨量传感器&#xff0c;通过漏斗收集雨水并记录。主要用于长期降雨统计&#xff0c;故障率较低。电容式降雨量传感器&#xff1a;基于两个电极之间的电容变化来计算降雨量。当降雨时&#xff…

2024年经济与国际贸易国际会议(ICEIT 2024)

2024年经济与国际贸易国际会议&#xff08;ICEIT 2024&#xff09; 2024 International Conference on Economy and International Trade 【重要信息】 大会地点&#xff1a;温州 大会官网&#xff1a;http://www.iciceit.com 投稿邮箱&#xff1a;iciceitsub-conf.com 【注意…

探索Elastic Search:强大的开源搜索引擎,详解及使用

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 全文搜索属于最常见的需求&#xff0c;开源的 Elasticsearch &#xff08;以下简称 Elastic&#xff09;是目前全文搜索引…

一个易于使用、与Android系统良好整合的多合一游戏模拟器

大家好&#xff0c;今天给大家分享的是一个易于使用、与Android系统良好整合的多合一游戏模拟器 Lemuroid。 Lemuroid 是一个专为Android平台设计的开源游戏模拟器项目&#xff0c;它基于强大的Libretro框架&#xff0c;旨在提供广泛的兼容性和卓越的用户体验。 项目介绍 Lem…

SQLServer 索引与数据完整性---学习笔记

索引 索引包含从表或视图中一个或多个列生成的键&#xff0c;以及映射到指定数据的存储位置的指针 索引是一个单独的、物理的数据库结构&#xff0c;在SQL Server中&#xff0c;索引是为了加速对表中数据行的检索而创建的一种分散存储结构。 它是针对一个表而建立的&#xff0…

【UIDynamic-动力学-UIAttachmentBehavior-附着行为-弹性附着 Objective-C语言】

一、弹性附着啊,我们来看一下, 1.刚才我们说了刚性附着,弹性附着,怎么着做啊,实际上,只需要多添加两个属性,就可以了, 实际上,添加一个,也可以啊, 我们把这个length,先注释掉, 先注释掉,self.attach.length = 100;这句话, 固定的长度啊,给它注释掉, 然后呢…

多源 BFS

例题一 解法&#xff08;bfs&#xff09;&#xff08;多个源头的最短路问题&#xff09; 算法思路&#xff1a; 对于求的最终结果&#xff0c;我们有两种⽅式&#xff1a; • 第⼀种⽅式&#xff1a;从每⼀个 1 开始&#xff0c;然后通过层序遍历找到离它最近的 0 。 …

Spring底层原理之bean的加载方式一 用XML方式声明bean 自定义bean及加载第三方bean 2024详解

目录 用XML方式声明bean 首先我们创建一个空的java工程 我们要导入一个spring的依赖 注意在maven工程里瞅一眼 我们创建一个业务层接口 还有四个实现类 我们最初的spingboot生命bean的方式是通过xml声明 我们在resources文件夹下创建一个配置文件 我们书写代码 首先初…

糖尿病早中期症状常常被人们忽视,从而错过最佳的干预时机。

我们都知道糖尿病有“三多一少”&#xff08;多饮、多尿、多食、体重减少&#xff09;的典型症状。然而&#xff0c;现实中糖尿病的表现并非总是如此清晰。更麻烦的是&#xff0c;糖尿病具有很强的隐匿性&#xff0c;若不做血糖检查&#xff0c;多数人难以察觉自己已患病。 今天…

什么无线麦克风音质最好,领夹无线麦克风最新推荐!

当今社会&#xff0c;直播销售的热潮与个人视频日志的流行趋势正重塑着内容创作领域的面貌&#xff0c;同时这也极大地激发了麦克风市场的活力。特别是无线领夹麦克风&#xff0c;它以轻便的设计理念和高效的录音性能&#xff0c;俘获了众多视频创作者的心。无论是在直播带货中…