树莓派3B Qt designer+Pyqt5+pycharm超声测距(9)

本教程详细介绍了如何使用Qtdesigner设计UI界面,并将其转换为PyQt5代码,结合树莓派3B和超声传感器HR-SR04,实现距离测量的实时显示。从配置PyQt5环境、设计UI界面、转换UI文件到Python代码,再到编写测距程序,直至在PyCharm中运行,全过程讲解清晰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内容

本文介绍:使用Qt designer设计ui,将ui转换成py代码后,利用pycharm进行Python编程,写出测距可视化程序。
硬件:树莓派3B,超声传感器hrsr04,杜邦线

1、配置pyqt5

sudo apt-get install python3-pyqt5

成功安装后,再输入指令会提示已经安装
在这里插入图片描述

2、ui设计

1、ui

关于qt的安装配置问题,挪步此处:
树莓派3B+Qt Creator图形界面编程控制led灯(6)
打开qt designer设计ui
在这里插入图片描述
新建,这里选的是withoutbutton
在这里插入图片描述
点击保存,最好新建一个自己能找到的文件夹,名字自己取,这里是’distancetest’
加label,双击改名Distance
加button x 2:Getdata Stop
加lineEdit
在这里插入图片描述
注意,objectName是和后面的代码对应的,相当于控件的身份ID,我这里分别是:
对话框----Dialog_lx
label(Distance)----label
lineEdit----distanceEdit
button(Getdata)----getdata
button(Stop)----stop
在这里插入图片描述
Edit添加点击信号函数
在这里插入图片描述
点击编辑信号以后,鼠标拖动 button,就会弹出对话框,选择左侧clicked(),编辑
在这里插入图片描述
点击加号,增加getdata_clicked()函数,----OK----OK
在这里插入图片描述
接着可以看到这里已经有对应函数了
在这里插入图片描述
stop按钮同理
保存ui文件

2、ui文件转py文件

花了比较长的时间解决的问题
打开shell

alias pyuic5="python3 -m PyQt5.uic.pyuic"

切换至存放ui文件的目录

pyuic5 distancetest.ui -0 ui_ distancetest

在这里插入图片描述
成功得到py文件!
在这里插入图片描述

3、装pycharm

安装包:https://www.jetbrains.com/pycharm/download/#section=linux.
在这里插入图片描述
压缩包放进能找到的目录
打开shell,解压命令

tar zxvf pycharm-community-2020.1.1.tar.gz

然后,文件管理器进入解压后的目录
在这里插入图片描述
在这里点击键盘上F4,直接进入已经切换到此目录的shell界面
输入命令:

sudo sh pycharm.sh

开始进入pycharm。
在这里插入图片描述
如果错误提示:No JDK found. Please validate either PYCHARM JDK, JDK_ HOME or JAVA HOME…
用以下指令(来源:https://blog.youkuaiyun.com/a616735104/article/details/101625753

sudo apt-get purge openjdk-8-jre-headless
sudo apt-get install openjdk-8-jre-headless
sudo apt-get install openjdk-8-jre

如果还不行:
1、根据错误提示自行百度
2、砸树莓派
3、那就不用pycharm了,其实后面的过程用thonny也可以,只不过没有pycharm方便

4、上代码

成功进入pycharm后,建立工程,把刚才的py文件复制到你创建工程的文件夹,再加入工程入口和超声测距代码

入口:main_server.py

import sys, time
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication,QPushButton,QWidget,QHBoxLayout,QMainWindow,QLabel
from PyQt5.QtCore import QTimer, QThread, pyqtSignal,QDateTime,QTime
from ui_distancetest import *
from ui_distancetest import Ui_Dialog_lx
from testhr import *

class Dialog_lx(QtWidgets.QMainWindow, Ui_Dialog_lx):
    def __init__(self, parent=None):
        super(Dialog_lx, self).__init__(parent=parent)
        self.setupUi(self)
        # 初始化一个定时器
        self.timer = QTimer(self)
        # 定义时间超时连接start_app
        self.timer.timeout.connect(self.getdatastart)
        # 定义时间任务是一次性任务
        # self.timer.setSingleShot(True)
        # 实例化一个线程
        self.work = WorkThread()
        # 多线程的信号触发连接到distance
        self.work.trigger.connect(self.distance)

    def getdatastart(self):
        #启动定时器
        self.timer.start(500)#500ms采集一次距离
        self.work.start()

    def timerstop(self):
        print('stop')
        self.distanceEdit.setText('stop')
        #关闭定时器
        self.timer.stop()

    def distance(self, str):
        hr2 = hrsr04()
        a=hr2.checkdist()
        time = QTime.currentTime()
        t=time.toString()#时间
        print(t+':    %0.2f cm' % a)
        self.distanceEdit.setText('%0.2f cm' % a)#显示距离

class WorkThread(QThread):
    # 定义一个信号
    trigger = pyqtSignal(str)

    def __int__(self):
        # 初始化函数,默认
        super(WorkThread, self).__init__()

    def run(self):
		#触发信号
        self.trigger.emit('')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Dialog_lx()
    w.show()
    hr=hrsr04()
    hr.inithr()
    sys.exit(app.exec_())

测距:testhr.py

import sys
import RPi.GPIO as GPIO
import time

class hrsr04:
    def __init__(self):
        self.Trig_Pin = 20#引脚,BCM编号
        self.Echo_Pin = 21
    def inithr(self):
        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(self.Trig_Pin, GPIO.OUT, initial = GPIO.LOW)
        GPIO.setup(self.Echo_Pin, GPIO.IN)
        # time.sleep(2)

    def checkdist(self):
        GPIO.output(self.Trig_Pin, GPIO.HIGH)
        time.sleep(0.00015)
        GPIO.output(self.Trig_Pin, GPIO.LOW)
        while not GPIO.input(self.Echo_Pin):
            pass
        t1 = time.time()
        while GPIO.input(self.Echo_Pin):
            pass
        t2 = time.time()
        return (t2-t1)*340*100/2#返回距离值

ui:ui_distancetest.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'distancetest.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!

import sys, time
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication,QPushButton,QWidget,QHBoxLayout,QMainWindow,QLabel
from PyQt5.QtCore import QTimer, QThread, pyqtSignal
from testhr import *

class Ui_Dialog_lx(object):
    def setupUi(self, Dialog_lx):
        Dialog_lx.setObjectName("Dialog_lx")
        Dialog_lx.resize(400, 300)
        self.label = QtWidgets.QLabel(Dialog_lx)
        self.label.setGeometry(QtCore.QRect(90, 90, 68, 31))
        self.label.setObjectName("label")
        self.getdata = QtWidgets.QPushButton(Dialog_lx)
        self.getdata.setGeometry(QtCore.QRect(90, 140, 211, 30))
        self.getdata.setObjectName("getdata")
        self.stop = QtWidgets.QPushButton(Dialog_lx)
        self.stop.setGeometry(QtCore.QRect(90, 180, 211, 30))
        self.stop.setObjectName("stop")

        self.distanceEdit = QtWidgets.QLineEdit(Dialog_lx)
        self.distanceEdit.setGeometry(QtCore.QRect(170, 90, 131, 32))
        self.distanceEdit.setObjectName("distanceEdit")

        self.retranslateUi(Dialog_lx)
        self.getdata.clicked.connect(Dialog_lx.getdatastart)#绑定点击事件函数
        self.stop.clicked.connect(Dialog_lx.timerstop)#绑定点击事件函数
        QtCore.QMetaObject.connectSlotsByName(Dialog_lx)

    def retranslateUi(self, Dialog_lx):
        _translate = QtCore.QCoreApplication.translate
        Dialog_lx.setWindowTitle(_translate("Dialog_lx", "Dialog"))
        self.label.setText(_translate("Dialog_lx", "Distance:"))
        self.getdata.setText(_translate("Dialog_lx", "Getdata"))
        self.stop.setText(_translate("Dialog_lx", "Stop"))

在这里插入图片描述
在main_server.py上右键,run
在这里插入图片描述

5、上结果

1、点击getdata,每500ms更新一次距离数据:
在这里插入图片描述
点击stop,定时器停止工作
在这里插入图片描述

把这三个文件放在同一目录,用thonny运行main_server.py,一样可以

在这里插入图片描述

课程作业,边学边用,如有错漏,敬请指正
参考:
ui转py:https://blog.youkuaiyun.com/u011728480/article/details/53423036
pycharm安装:https://www.cnblogs.com/shuoliuchina/p/11667391.html
树莓派3中安装JDK:https://blog.youkuaiyun.com/a616735104/article/details/101625753
pyqt5 使用 QTimer, QThread, pyqtSignal 实现自动执行,多线程,自定义信号触发:
https://blog.youkuaiyun.com/weixin_30652491/article/details/98882308?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-4
QtDesigner设计UI界面:https://xugaoxiang.com/2019/12/04/pyqt5-3-qtdesigner/
树莓派3B超声测距:https://blog.youkuaiyun.com/qq_41102371/article/details/105730597

--------------------------------------------------------------------------------------------诺有缸的高飞鸟202005
### 如何在 PyCharmPyQt5QtDesigner 中实现代码同步 为了实现在 PyCharmPyQt5QtDesigner 之间的代码同步,可以按照以下方法操作: #### 配置环境 首先,在 PyCharm 中完成 PyQt5 及其相关工具的安装和配置。这一步可以通过 pip 安装 PyQt5 并确保 `pyuic5` 工具可用[^2]。 ```bash pip install pyqt5 ``` 接着验证 `pyuic5` 是否成功安装并可执行: ```bash pyuic5 -h ``` 如果命令返回帮助信息,则说明已正确安装该工具[^3]。 --- #### 使用 Qt Designer 创建 UI 文件 通过运行 Qt Designer 来创建 `.ui` 文件。此文件定义了图形化界面布局及其组件属性。保存设计后的 `.ui` 文件以便后续处理[^1]。 --- #### 转换 .ui 文件为 Python 代码 利用 `pyuic5` 将 `.ui` 文件转换成对应的 Python 代码。假设有一个名为 `example.ui` 的文件,可以在终端中输入如下命令将其转译为 `example_ui.py` 文件: ```bash pyuic5 example.ui -o example_ui.py ``` 这条指令会生成一个基于所设计界面的纯 Python 实现版本。 --- #### 加载动态更新机制 (推荐方式) 为了让开发流程更加高效,建议采用一种自动化的方案来保持 `.ui` 文件与其对应 Python 文件的一致性。例如编写简单的脚本或者借助第三方插件定期监控 `.ui` 文件的变化情况,并触发重新编译过程。 以下是手动加载 `.ui` 文件的一个简单例子,这种方法无需每次都单独调用 `pyuic5` 命令行工具即可达到实时效果: ```python from PyQt5 import uic, QtWidgets class UiLoader(QtWidgets.QMainWindow): def __init__(self): super(UiLoader, self).__init__() # 动态加载 ui 文件 uic.loadUi('example.ui', self) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) window = UiLoader() window.show() sys.exit(app.exec_()) ``` 上述代码片段展示了如何直接从 `.ui` 文件构建应用程序窗口而不需要提前预编译它成为独立模块的形式。 --- #### 设置 PyCharm 运行调试支持 最后调整好项目结构之后,在 PyCharm 当中的设置选项里确认已经添加了必要的解释器路径以及库依赖关系;同时也可以考虑定制快捷键绑定至某些常用功能上比如一键启动模拟器等提升工作效率的操作习惯养成。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诺有缸的高飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值