PyQt上手教程汇总

article/2025/9/30 19:05:13

根据此前的PyQt学习,这里对PyQt的学习过程进行最后的总结

前文链接:由于前文标题名字取了一样的,以下内容按照前后顺序排列

(1)PyQt上手教程(一)_机械刘怀洋的博客-CSDN博客

(2)PyQt上手教程(一)_机械刘怀洋的博客-CSDN博客 

(3)PyQt上手教程(一)_机械刘怀洋的博客-CSDN博客

(4)PyQt上手教程(一)_机械刘怀洋的博客-CSDN博客

(5)PyQt上手教程(一)_机械刘怀洋的博客-CSDN博客

下面是最后一点内容

(十二)腾讯云函数

后续案例要用到腾讯云函数,这里先了解一下

注册腾讯云后新建一个函数

测试函数默认先不用管

完成

创建一个触发器

创建后这里有个链接

直接访问链接,可以看到已经调用

腾讯云给人使用的免费额度是100万次

(十三)Qt Designer

利用Qt Designer可以快速设计UI界面,比起直接写代码,效率要快速很多,下面记录一下Qt Designer使用过程

(1)Python调用ui文件显示界面

由于在Pycharm中直接配置了了PyQt5,PyQt5是自带Qt Designer工具的

所以直接在Anaconda工具包中搜索designer.exe,然后发送快捷方式到桌面

Qt Designer的快捷方式如下

双击designer.exe打开设计页面,新建空白页面

拖一些控件先做一个测试页面

直接crtl+s保存为ui文件

然后利用Python调用ui文件,Python代码以及显示功能如下

(2)案例展示

为了更好理解上述过程,这里做了一个案例巩固知识

如下图先做一个页面

这里把页面右下角的信号与槽拖出来

假设设计如下的信号与槽接收页面

当点击登录的时候,文本框就会关闭,预览效果如下,但是在设计页面设计信号与槽,功能很受限

(3)控件添加信号与槽

1.这里直接使用上面案例的界面,整体代码如下

"""
动态加载ui文件
"""
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uicclass MyWindow(QWidget):def __init__(self):super().__init__()self.ui = Noneself.user_name = Noneself.password = Noneself.init_ui()def init_ui(self):self.ui = uic.loadUi("D:\\Qt\\QtData\\PyQt\\PyQtLesson\\Qt Designer\\login_test.ui")# print(self.ui)                          # ui文件中最顶层的对象# print(self.ui.__dict__)                 # 最顶层对象的所有属性(key:value方式显示)# print(self.ui.label)                    # 最顶层对象中嵌套的QLabel# print(self.ui.label.text())             # 最顶层对象中嵌套的QLabel的文本self.user_name = self.ui.lineEdit              # 用户名输入框self.password = self.ui.lineEdit_2             # 密码输入框login_btn = self.ui.pushButton            # 登录按钮forget_btn = self.ui.pushButton_2         # 忘记密码按钮text_browser = self.ui.textBrowser        # 文本显示区域# 给登录按钮被点击绑定槽函数login_btn.clicked.connect(self.login)def login(self):"""实现登录的逻辑"""print("正在登录。。。。。。")# 提取用户名,密码print(self.user_name.text())print(self.password.text())if __name__ == '__main__':app = QApplication(sys.argv)w = MyWindow()w.ui.show()app.exec_()

2.关键代码分析

<1>__init__函数中声明属性

假设这里把__init__函数中的self.user_name = None等注释,Pycharm解释器会提醒

Instance attribute user_name defined outside __init__

这里的意思就是说,我在def init_ui(self):这个函数中,要给self指向的对象添加user_name这个属性,但是我在__init__函数中又没有进行这个属性的声明,于是要在__init__函数中声明一下

<2>窗口显示代码

这里我们发现窗口显示代码并不是w.show()

这是因为我们最终要显示的界面是ui所用的绘图界面,而不是调用w这个空壳界面

<3>print(self.ui.__dict__)

看看.ui文件有什么属性,如下图蓝色框,红色框是获取登录信息

在这里,我们看到加载后的.ui文件有7个对象属性,正好与在设计.ui文件时控件的数量一致,可见属性的个数正好对应.ui文件中的空间个数,所以想要操作哪个空间,就通过对象.属性的方式从.ui对象中提取即可。当然了不能盲目的提取,这些属性的名字其实就是在.ui文件中的空间的Object name,如下图

(4)点击登录按钮后槽函数的完善

这里完善一下上述的案例

"""
动态加载ui文件
"""
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uicclass MyWindow(QWidget):def __init__(self):super().__init__()self.ui = Noneself.user_name = Noneself.password_qwidget = Noneself.login_btn = Noneself.forget_btn = Noneself.text_browser = Noneself.init_ui()def init_ui(self):self.ui = uic.loadUi("D:\\Qt\\QtData\\PyQt\\PyQtLesson\\Qt Designer\\login_test.ui")# 提取要操作的控件self.user_name = self.ui.lineEdit              # 用户名输入框self.password_qwidget = self.ui.lineEdit_2             # 密码输入框self.login_btn = self.ui.pushButton            # 登录按钮self.forget_btn = self.ui.pushButton_2         # 忘记密码按钮self.text_browser = self.ui.textBrowser        # 文本显示区域# 给登录按钮被点击绑定槽函数self.login_btn.clicked.connect(self.login)def login(self):"""登录按钮的槽函数"""user_name = self.user_name.text()password = self.password_qwidget.text()if user_name == "admin" and password == "123456":self.text_browser.setText("欢迎%s" % user_name)self.text_browser.repaint()else:self.text_browser.setText("用户名或密码错误...请重试")self.text_browser.repaint()if __name__ == '__main__':app = QApplication(sys.argv)w = MyWindow()w.ui.show()app.exec_()

这里增加了一个条件判断登录逻辑

展示过程如下

(5)PyQt引入多线程

<1>引入:结合(4)中的案例,加入三行代码

重新运行效果如下

运行过程中,可以很明显的看到,程序是卡顿的

原因如下:

只要是带界面的程序,一般来说程序运行后会用当前线程进行事件的检查、按钮等图形界面的更新操作,如果在执行某个逻辑代码(例如登录)时耗时非常验证,此时就会出现界面卡顿

解决办法如下:

我们一般将界面的显示用主线程来操作,逻辑功能代码或者耗时操作的代码都用另外线程进行处理

这也就是为什么要研究PyQt中的多线程了,因为它能实现多任务,让界面用一个线程更新,让逻辑代码在另外一个线程中,互不影响

<2>PyQt使用多线程

1.使用QT Designer设计如下效果ui文件

2.整体代码如下

import sys
import timefrom PyQt5 import uic
from PyQt5.Qt import QApplication, QWidget, QThreadclass MyThread(QThread):def __init__(self):super().__init__()def run(self):for i in range(10):print("是MyThread线程中执行....%d" % (i + 1))time.sleep(1)class MyWin(QWidget):def __init__(self):super().__init__()self.init_ui()def init_ui(self):self.ui = uic.loadUi("D:\\Qt\\QtData\\PyQt\\PyQtLesson\\Qt Designer\\thread-1.ui")# 从ui文件中加载控件lineedit = self.ui.lineEditbtn1 = self.ui.pushButtonbtn2 = self.ui.pushButton_2# 给2个按钮绑定槽函数btn1.clicked.connect(self.click_1)  # 绑定槽函数btn2.clicked.connect(self.click_2)  # 绑定槽函数def click_1(self):for i in range(10):print("是UI线程中执行....%d" % (i + 1))time.sleep(1)def click_2(self):self.my_thread = MyThread()  # 创建线程self.my_thread.start()  # 开始线程if __name__ == "__main__":app = QApplication(sys.argv)myshow = MyWin()myshow.ui.show()app.exec()

3.运行如下

可以看到,单线程的时候,是无法做到同时输入的

只有在线程执行结束后,输入的内容才会显示出来

而多线程情况下,可以同时输入内容

4.关键代码分析

这里的创建线程加self的原因分析

如下图所示,虽然代码中没有调用del,但是def click_2(self):结束后会直接删掉my_thread

这时候引用技术编程0但是线程还活着,程序就不会正常运行

(6)PyQt多线程案例

这里提供了一个案例巩固上述多线程的知识点

该代码和上述代码基本相同,这里不多做介绍

<1>整体代码

import json
import sys
import timefrom PyQt5 import uic
from PyQt5.Qt import QApplication, QWidget, QThread
from PyQt5.QtCore import pyqtSignalclass LoginThread(QThread):# 创建自定义信号start_login_signal = pyqtSignal(str)def __init__(self):super().__init__()def login_by_requests(self, user_password_json):# 将json字符串,转换为自定,从而实现传递了用户名以及密码user_password_json = json.loads(user_password_json)print(user_password_json.get("user_name"))print(user_password_json.get("password"))def run(self):# 通过whileTrue的方式让子线程一直运行,而不是结束# 通过这种方式,我们让子线程一直活着,从而有能力接收来自主线程 (UI线程)的任务while True:print("子线程正在执行....")time.sleep(1)class MyWindow(QWidget):def __init__(self):super().__init__()self.ui = Noneself.user_name_qwidget = Noneself.password_qwidget = Noneself.login_btn = Noneself.forget_password_btn = Noneself.textBrowser = Noneself.login_thread = Noneself.init_ui()def init_ui(self):self.ui = uic.loadUi("D:\\Qt\\QtData\\PyQt\\PyQtLesson\\Qt Designer\\login_test.ui")# 提取要操作的控件self.user_name_qwidget = self.ui.lineEdit            # 用户名输入框self.password_qwidget = self.ui.lineEdit_2           # 密码输入框self.login_btn = self.ui.pushButton                  # 登录按钮self.forget_password_btn = self.ui.pushButton_2      # 忘记密码按钮self.textBrowser = self.ui.textBrowser                # 文本显示区域# 绑定信号与槽函数self.login_btn.clicked.connect(self.login)# 创建一个子线程(注意这里要将Login_thread变量变为对象的属性,如果不是对象属性,而是一个普通的局部变量的话# 会随着init_ui函数执行结束而被释放此时子线程还没有执行完毕所有会产生问题)self.login_thread = LoginThread()# 将要创建的子线程类中的信号进行绑定self.login_thread.start_login_signal.connect(self.login_thread.login_by_requests)# 让子线程开始巩工作self.login_thread.start()def login(self):"""登录按钮的槽函数"""user_name = self.user_name_qwidget.text()password = self.password_qwidget.text()# 发送信号,让子线程开始登录self.login_thread.start_login_signal.emit(json.dumps({"user_name": user_name, "password": password}))if __name__ == '__main__':app = QApplication(sys.argv)w = MyWindow()w.ui.show()app.exec_()

<2>代码运行结果

(7)PyQt链接云函数

<1> 云函数的修改

在(十二)节中,已经介绍了云函数

为了在本小节介绍PyQt链接云函数,这里对之前的云函数做一下修改如下

<2> 本地整体代码

import json
import sys
import time
import requestsfrom PyQt5 import uic
from PyQt5.Qt import QApplication, QWidget, QThread
from PyQt5.QtCore import pyqtSignalclass LoginThread(QThread):# 创建自定义信号start_login_signal = pyqtSignal(str)def __init__(self, signal):super().__init__()self.login_complete_signal = signaldef login_by_requests(self, user_password_json):# 将json字符串,转换为自定,从而实现传递了用户名以及密码user_password_json = json.loads(user_password_json)print(user_password_json.get("user_name"))print(user_password_json.get("password"))# 使用requests模块发送请求(POST)r = requests.post(url = "https://service-ed6mmhrc-1318499709.nj.apigw.tencentcs.com/release/test", json = user_password_json())print("收到腾讯服务器的相应:", r.content.decode())ret = r.json()print("这里要发送信号给UI线程.....")self.login_complete_signal.emit(json.dumps(ret))def run(self):# 通过whileTrue的方式让子线程一直运行,而不是结束# 通过这种方式,我们让子线程一直活着,从而有能力接收来自主线程 (UI线程)的任务while True:print("子线程正在执行....")time.sleep(1)class MyWindow(QWidget):# 创建定义信号login_status_signal = pyqtSignal(str)def __init__(self):super().__init__()self.ui = Noneself.user_name_qwidget = Noneself.password_qwidget = Noneself.login_btn = Noneself.forget_password_btn = Noneself.textBrowser = Noneself.login_thread = Noneself.init_ui()def init_ui(self):self.ui = uic.loadUi("D:\\Qt\\QtData\\PyQt\\PyQtLesson\\Qt Designer\\login_test.ui")# 提取要操作的控件self.user_name_qwidget = self.ui.lineEdit            # 用户名输入框self.password_qwidget = self.ui.lineEdit_2           # 密码输入框self.login_btn = self.ui.pushButton                  # 登录按钮self.forget_password_btn = self.ui.pushButton_2      # 忘记密码按钮self.textBrowser = self.ui.textBrowser                # 文本显示区域# 绑定信号与槽函数self.login_btn.clicked.connect(self.login)# 创建一个信号,用让子线程登录成功之后向主线程发送self.login_status_signal.connect(self.login_status)# 创建一个子线程(注意这里要将Login_thread变量变为对象的属性,如果不是对象属性,而是一个普通的局部变量的话# 会随着init_ui函数执行结束而被释放此时子线程还没有执行完毕所有会产生问题)self.login_thread = LoginThread(self.login_status_signal)# 将要创建的子线程类中的信号进行绑定self.login_thread.start_login_signal.connect(self.login_thread.login_by_requests)# 让子线程开始巩工作self.login_thread.start()def login(self):"""登录按钮的槽函数"""user_name = self.user_name_qwidget.text()password = self.password_qwidget.text()# 发送信号,让子线程开始登录self.login_thread.start_login_signal.emit(json.dumps({"user_name": user_name, "password": password}))def login_status(self, status):print("status.....", status)status_dict = json.loads(status)self.textBrowser.setText(status_dict.get("errmsg"))self.textBrowser.repaint()if __name__ == '__main__':app = QApplication(sys.argv)w = MyWindow()w.ui.show()app.exec_()

<3> 重要代码解析

本段代码中最重要的是使用requests模块向网站发送请求

<4> 运行结果

可以从运行结果中看出来,已经 收到了腾讯服务器的相应病输出了登录的信息

 由于电脑的性能不够,在运行代码的时候报了如下提示,经过查询是正常的

 到此,PyQt的基础上手教程到此完整的过了一遍


http://chatgpt.dhexx.cn/article/uXpqx3Cy.shtml

相关文章

pyqt基础教程

PYQT是python版本的QT界面程序包&#xff0c;大家写过C、C#都做过界面设计&#xff0c;python也一样&#xff0c;非常简单。跟着我的思路走&#xff0c;五分钟学会&#xff01; 1、主体框架先造一个窗口 以下程序直接抄过去。 以下程序直接抄过去。 以下程序直接抄过去。 #!…

Mac 下安装pip,卸载pip方法

mac下直接安装pip和卸载pip的方法如下&#xff1a; 1、pip的安装&#xff1a; 输入 sudo easy_install pip 就可以安装 pip 了。 验证pip安装是否成功&#xff1a; 输入&#xff1a;pip 结果找不到文件。 尝试输入&#xff1a;pip3 -V 或者 pip3 则说明已经安装成功了。 …

pip3在Ubuntu下的安装、升级、卸载

一、参考资料 pip 常用命令 pip 官方文档 二、安装pip包 如何在 Ubuntu 20.04 上安装 Python Pip - 知乎 (zhihu.com) 1. 离线安装 Installation pip下载地址 1.1 为 Python 3 安装 pip 方式一 # 下载get-pip.py脚本 wget https://bootstrap.pypa.io/pip/3.6/get-pip.p…

conda和pip卸载包的注意事项

安装和import时包的名称不一致时&#xff0c;比如scikit-learn和sklearn&#xff08;scikit意思是科学工具箱&#xff0c;通常被缩写成sk, 比如scikit-image和skimage也是同样的情况&#xff09; 卸载的时候还是应该用包的全称&#xff0c;也就是与安装时一致用pip安装的就要用…

Python 技巧篇-pip卸载python库实例演示,查看pip命令大全方法

因为安装的 PyHook3 没安装对吧&#xff0c;有点问题&#xff0c;就想着把它卸载掉&#xff0c;然后再重新安装一个&#xff0c;那应该怎么卸载呢&#xff1f; 非常简单&#xff0c;就是 pip uninstall xxx&#xff0c;正好和我们安装时的 pip install xxx 对应&#xff0c;下…

windows下将python自带的pip卸载了,怎么重新装pip

文章目录 windows下将python自带的pip卸载了&#xff0c;怎么重新装pipLinux下将python自带的pip卸载了&#xff0c;怎么重新装pip新装Linux系统没有pip怎么装pip方法1方法2方法3总结 Linux换pip为国内镜像源|pip换源|pip修改源 windows下将python自带的pip卸载了&#xff0c;怎…

解决“更新pip版本竟将pip卸载了,提示No module named ‘pip‘”

更新pip后&#xff0c;报错无权限之类的&#xff0c;结果在运行pip发现被卸载了。 ModuleNotFoundError: No module named ‘pip’ ![在这里插入图片描述](https://img-blog.csdnimg.cn/fe4c7037709d4c7495627a706eb0ff28.png?x-oss-processimage/watermark,type_d3F5LXplbmhl…

如何使用Pip卸载软件包?

Python Pip command provides search, install, update, uninstall packages. We can use pip command to uninstall packages easily even there are some alternatives like easy_install. Python Pip命令提供搜索,安装,更新,卸载软件包。 即使有easy_install之类的替代方…

【三维点云】01-激光雷达原理与应用

文章目录 内容概要1 激光雷达原理1.1 什么是激光雷达&#xff1f;1.2 激光雷达原理1.3 激光雷达分类三角法TOF法脉冲间隔测量法幅度调制的相位测量法 相干法激光雷达用途 2 激光雷达安装、标定与同步2.1 激光雷达安装方式考虑因素 2.2 激光雷达点云用途2.3 数据融合多激光雷达数…

轻量化固态激光雷达的三维定位与建图

点云PCL免费知识星球&#xff0c;点云论文速读。 文章&#xff1a;Lightweight 3-D Localization and Mapping for Solid-State LiDAR 作者&#xff1a;Han Wang, Chen Wang, and Lihua Xie 编译&#xff1a;点云PCL 代码&#xff1a;https://github.com/wh200720041/ssl_slam.…

ROS移动机器人 Solidworks整个机器人设计文件(三维 激光雷达 arduino nvidia)(SLDPRT SLDASM)

还是17年本科时制作的毕业设计&#xff0c;基于solidworks 2014所制作。 文件里包含了制作的整个移动机器人的SolidWorks原文件。 是设计完各个零件然后组合在一起的&#xff0c;所以适用性很强&#xff0c;可以根据你的需求将绘制的零件加到你的机器人solidwroks三维中&…

Velodyne 16线三维激光雷达

Velodyne 16线三维激光雷达VLP-16介绍 16线激光雷达VLP-16是Velodyne公司出品的小型的3维激光雷达&#xff0c;保留了电机转速可调节的功能。实时上传周围距离和反射率的测量值。16线激光雷达VLP-16具有100米的远量程测量距离。精巧的外观设计使得安装非常方便。重量轻&#xf…

技术分享 | 带你探索三维激光雷达“眼中”的世界

远在火星的美国毅力号探测器早已开始工作&#xff0c;并不断的采集火星的数据传回到地球。现实中距离大众最近的无人车有谷歌的Google Driverless Car&#xff0c;以及特斯拉的model电动汽车。无人驾驶汽车正逐渐走进普通人的生活中。 毅力号火星探测器 谷歌无人汽车 提到无人驾…

ubuntu18.04使用calibration_toolkit进行相机和三维激光雷达的联合标定

一、配置 硬件配置&#xff1a; 速腾聚创激光雷达32线、usb相机&#xff1b; 软件配置&#xff1a; ubuntu18.04、calibration_toolkit、autoware1.12.0、opencv3.4.3 (软件的安装及配置遇到的问题可以参考我别的博客&#xff0c;可能会有你想要的答案&#xff0c;标定其实…

ubuntu16.04 lidar_align实现三维激光雷达和Imu联合标定

实现环境&#xff1a; 系统环境&#xff1a; Ubuntu16.04激光雷达&#xff1a; velodyne16线imu品牌 &#xff1a; xsens 一 简介 lidar-imu标定方法为瑞士苏黎世理工大学-自动驾驶实验室开源的一种校准 3D 激光雷达和 6 自由度位姿传感器外参的方法。该方法需要大量非平面…

【ouster】ubuntun18.04安装ouster三维激光雷达ros版本驱动

1、下载驱动文件 需先创建一个ros工作区间&#xff0c;如何将代码下载至src文件夹 mkdir catkin_ws_ouster/srccd catkin_ws_ouster/srccatkin_init_workspacecd ..source devel/setup.shsudo gedit ~/.bashrc#将下列代码添加至打开的文件source ~/catkin_ws_ouster/devel/set…

激光雷达--C16镭神16线三维激光雷达使用

一、基础知识介绍 1、点云数据一边采集一边重构&#xff0c;对处理器的硬件资源消耗特别大&#xff0c;所以用电脑作为处理器时&#xff0c;电脑的配置要高&#xff0c;具体需要什么杨的配置&#xff0c;下面会有数据介绍。 2、虽然激光雷达采集的数据和摄像头采集的数据没法…

基于曲率的体素聚类的三维激光雷达点云实时鲁棒分割方法

点云PCL免费知识星球&#xff0c;点云论文速读。 文章&#xff1a;Curved-Voxel Clustering for Accurate Segmentation of 3D LiDAR Point Clouds with Real-Time Performance 作者&#xff1a;Seungcheol Park, Shuyu Wang, Hunjung Lim, and U Kang 编译&#xff1a;点云PCL…

从零开始的三维激光雷达SLAM教程第一讲(搭建运行环境,并跑Kitti数据集)

文章目录 引言第一节&#xff1a;运行xx-LOAM与数据集编译A-LOAM安装ceres&#xff08;最小二乘求解库&#xff09;安装pcl&#xff08;最常见的点云处理库&#xff09;安装OPENCVcatkin_make 制作Kitti数据集运行A-LOAM建图LOAM安装Lego-LOAM安装gtsam安装 结果 引言 毕业设计…