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

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 Threadclass Window(QMainWindow):pysignal = QtCore.pyqtSignal(str)def __init__(self):super().__init__()self.taskList = []self.logList = []self.logIndex = 1self.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 layoutself.taskListView = QListWidget()self.logListView = QListWidget()left_layout.addWidget(self.taskListView)left_layout.addWidget(self.logListView)# Right side layoutcreate_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)+1item = 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 += 1self.pysignal.emit(content)def clearLog(self):self.logListView.clear()def getCurrentIndex(self):curItem = self.taskListView.currentItem()if curItem:index = curItem.data(1)return indexelse:return -1def _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 = logCallbackdef 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.mzph.cn/bicheng/34125.shtml

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

相关文章

Java NIO Buffer概念

针对每一种基本类型的 Buffer &#xff0c;NIO 又根据 Buffer 背后的数据存储内存不同分为了&#xff1a;HeapBuffer&#xff0c;DirectBuffer&#xff0c;MappedBuffer。 HeapBuffer 顾名思义它背后的存储内存是在 JVM 堆中分配&#xff0c;在堆中分配一个数组用来存放 Buffe…

【经验分享】免费版虚拟机VMware Workstation Pro 17下载方式

【经验分享】免费版虚拟机VMware Workstation Pro 17下载方式 前言一、免费虚拟机下载方式二、 安装过程总结 前言 我真的是服了&#xff0c;现在的CSDN时效性为什么这么差了。都快一个月了还没有博主更新个人免费版虚拟机VMware Workstation Pro&#xff0c;甚至很多人还不知…

【运维】使用 Docker Compose 快速启动项目全流程指南

文章目录 docker-compose启动项目流程1. 安装 Docker 和 Docker Compose2. 准备 Docker Compose 文件3. 启动 Docker Compose 服务4. 检查运行状态5. 停止服务示例 docker-compose.yaml 文件 为什么要用docker-compose1. 微服务架构的实现2. 依赖管理3. 简化开发和测试环境4. 方…

RFID技术在汽车轮胎加工工艺中的革新应用

RFID技术在汽车轮胎加工工艺中的革新应用 物联网技术的飞速发展&#xff0c;无线射频识别&#xff08;Radio Frequency Identification&#xff0c;简称RFID&#xff09;技术因其独特的优势&#xff0c;在各行各业中展现出巨大的应用潜力。特别是在汽车制造业&#xff0c;RFID…

推荐一款好用的浏览器翻译插件——欧路翻译

近些年&#xff0c;机器翻译的效果越来越好&#xff0c;于是也有更多的开发者&#xff0c;开发了免费使用的浏览器翻译插件。这大大的帮助了我们查看国外的网站&#xff0c;有利于大家获取更多的信息。 在此&#xff0c;给大家推荐一款免费好用的浏览器插件——欧路翻译。支持…

我在高职教STM32——LCD液晶显示(4)

大家好&#xff0c;我是老耿&#xff0c;高职青椒一枚&#xff0c;一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次&#xff0c;同行应该都懂的&#xff0c;老师在课堂上教学几乎是没什么成就感的。正因如此&#xff0c;才有了借助 CSDN 平台寻求认同感和成就…

[经验] 如何做虾炒白菜 #学习方法#知识分享

如何做虾炒白菜 虾炒白菜的做法 虾炒白菜是一道营养丰富且美味可口的菜肴&#xff0c;虾肉的鲜嫩与白菜的甜脆相结合&#xff0c;口感极佳。接下来&#xff0c;让我们一起来学习一下虾炒白菜的详细做法。 食材准备 虾&#xff1a;约200克&#xff08;选用新鲜活虾&#xff…

【深度学习】python之人工智能应用篇——视频生成技术

视频生成技术是一种基于深度学习和机器学习的先进技术&#xff0c;它使得计算机能够根据给定的文本、图像、视频等单模态或多模态数据&#xff0c;自动生成符合描述的、高保真的视频内容。这种技术主要依赖于深度学习模型&#xff0c;如生成对抗网络&#xff08;GAN&#xff09…

基于 Native 技术加速 Spark 计算引擎

本文整理自 2024 年 6 月 DataFunSummit 2024 OLAP 架构峰会 Lakehouse 湖仓一体化架构论坛的同名主题分享。 今天分享的主题是基于 Native 技术加速 Spark 计算引擎&#xff0c;大家将会了解到如何基于 ClickHouse 来改造 Spark 引擎&#xff0c;最终获得较为可观的性能提升。…

C++实现多线程安全的生产者消费者字节缓冲区

文章目录 介绍实现细节**BytesBuffer 类****生产者和消费者** 性能优化总结 介绍 本文介绍如何使用C实现一个多线程安全的简单字节缓冲区&#xff0c;并进行性能测试。 实现细节 BytesBuffer 类 BytesBuffer 类通过使用条件变量和双缓冲区机制&#xff0c;实现了生产者和消…

【Linux】 在 Linux 中更换主机名

那年夏天我和你躲在 这一大片宁静的海 直到后来我们都还在 对这个世界充满期待 今年冬天你已经不在 我的心空出了一块 很高兴遇见你 让我终究明白 回忆比真实精彩 &#x1f3b5; 王心凌《那年夏天宁静的海》 在 Linux 系统中&#xff0c;更换主机名是系统…

使用Redis Lua脚本实现高级限流策略

引言 在现代的Web应用中&#xff0c;限流是一个非常重要的功能&#xff0c;它帮助我们控制对某些资源的访问频率&#xff0c;以防止系统过载和滥用。Redis是一个高性能的键值存储系统&#xff0c;它的原子操作和Lua脚本功能为实现复杂的限流策略提供了强大的支持。本文将详细介…

day50 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列

1143. 最长公共子序列 提示 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删…

大腾智能,基于云原生的国产工业协同平台

大腾智能是一家基于云原生的国产工业软件与数字化协同平台&#xff0c;专注于推动企业数字化转型与升级&#xff0c;为企业提供一系列专业、高效的云原生数字化软件及方案&#xff0c;推动产品设计、生产及营销展示的革新&#xff0c;实现可持续发展。 大腾智能旗下产品 3D模型…

USB2.0学习4--USB包结构和包类型

目录 1. USB包基本结构 1.1 SOP域&#xff08;Start Of Packet&#xff09; 1.2 SYNC域&#xff08;同步域&#xff09; 1.3 PID域&#xff08;标识域&#xff09; 1.4 地址域&#xff08;ADDR&#xff09; 1.5 帧号域&#xff08;Fram&#xff09; 1.6 数据域&#xff…

前端也需要知道的一些常用linux命令

前端也需要知道的一些常用linux命令 1.问题背景2.连接工具&#xff08;SecureCRT_Portable&#xff09;a.下载工具b.连接服务器c.登录到root账户 3.基本命令a.cd命令和cd ..b.ll命令和ls命令c:cp命令d.rm命令e:rz命令f.unzip命令g.mv命令h.pwd命令&#xff08;这里没有用到&…

机器学习之支持向量机丨神经网络测试

选择题 SVM中的什么是支持向量&#xff1f; 【 正确答案: D】 A. 数据集中的所有样本 B. 模型参数 C. 模型的预测输出 D. 训练数据中离决策边界最近的样本点 支持向量机(SVM)算法的主要目标是&#xff1a; 【 正确答案: C】 A. 最小化间隔 B. 最小化损失函数 C. 最大化间隔 D.…

【LinuxC语言】TCPIP的经典5层结构

文章目录 前言TCP/IP的结构结构示意图结构的含义生活中的TCP/IP例子总结前言 TCP/IP,全称传输控制协议/因特网互联协议,是用于在互联网上进行数据交换的一组协议,形成了互联网的基础。TCP/IP的经典五层结构包括:物理层、数据链路层、网络层、传输层和应用层。这些层次各自…

CSS 相对父级固定,且不随滚动条滚动

CSS 相对父级固定&#xff0c;且不随滚动条滚动 <div class"parent"><div class"child-one">我是固定位置的子元素</div><div class"child-tow">我是滚动的子元素</div> </div>.parent {height: 200px; /*…

以正合,以奇胜,守正出奇,稳健

个人感觉说实话&#xff0c;在所里待的这几年&#xff0c;尤其是后两年&#xff0c;收获颇多&#xff0c;不管是智识上的&#xff0c;还有一堆兄弟&#xff0c;还有愿意分享和帮助我的老师们。 不管是搞科研还是做生意&#xff0c;稳健&#xff0c;在所里的时候&#xff0c;有…