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

news/2024/5/18 8:58:35 标签: python, pyqt, raspberry pi, qt5, pycharm

内容

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

pyqt5_3">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文件!
在这里插入图片描述

pycharm_53">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.csdn.net/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

python">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

python">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

python"># -*- 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.csdn.net/u011728480/article/details/53423036
pycharm安装:https://www.cnblogs.com/shuoliuchina/p/11667391.html
树莓派3中安装JDK:https://blog.csdn.net/a616735104/article/details/101625753
pyqt5 使用 QTimer, QThread, pyqtSignal 实现自动执行,多线程,自定义信号触发:
https://blog.csdn.net/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.csdn.net/qq_41102371/article/details/105730597

--------------------------------------------------------------------------------------------诺有缸的高飞鸟202005

http://www.niftyadmin.cn/n/1082200.html

相关文章

Fms教程7 理解共享对象

理解共享对象 共享对象可以存储任何Flash支持的数据类型。就存放位置来说,共享对象可以分成存在客户端计算机的本地型,以及存放在服务器上的远程型。你可以用它来记录用户的相关信息(如用户名、性别和其它设置参数等),…

求根计算机在线,jQuery实现的简单在线计算器功能

本文实例讲述了jQuery实现的简单在线计算器功能。分享给大家供大家参考,具体如下:先来看看运行效果图:完整代码如下:/p>"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">jQuery计算器.div{border:gre…

win10+vs2013配置pcl 1.8.0

1、准备 1、环境: windows系统(本文win10)、vs2013、查看自己电脑位数(请挪步百度) pcl 1.8.0 win32win64版本: https://pan.baidu.com/s/1TYIXcWeRFiShK5Bhwx-EoQ 提取码:owig 说明&#xff1…

【郭林专刊】介绍六个有用的MySQL的SQL语句

本文给大家介绍六条比较有用的MySQL的SQL语句,可能很多人都通过PHP来实现这些功能。 1. 计算年数 你想通过生日来计算这个人有几岁了。 SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(now()) - TO_DAYS(dateofbirth)), %Y) 0; 2. 两个时间的差 取得两个 dateti…

EHR 在Win2008R2 IIS7.5 上的配置要点

首先,确定安装了WebDAV for IIS7.5(win2008R2 上,通过Sever Manager –>Web Server(IIs)->Add Role Service 安装 ) 1.Application Pool 的Enable 32 bit Application true 2.temp 目录 打开 匿名验证 和 集成windows身份…

htm引用html的标签,HTML noframes 标签

HTML 标签HTML5不支持该标签 标签用于支持不支持 元素的浏览器,请参考下面的示例:实例显示三个frame框架,如果不支持frame输出 标签的文本:抱歉,您的浏览器不支持 frame 属性!尝试一下 浏览器支持目前大多数…

像对待老婆一样去对待客户

不是有那么几句经典的话吗?对待老婆,要做到以下两点: 第一、老婆的话永远都是对的。 第二、如果老婆错了,请参考第一条。 可能很多人都拿这个当玩笑,我突然发现拿来和客户对比,其实有很多异曲同工之妙。…

Hdu-1874 畅通工程再续

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1874 题目大意&#xff1a;求最短路 解题思路&#xff1a; 最裸的单源多点最短路-Dijkstra算法 代码如下&#xff1a; #include<iostream> #include<map> #include<cstdio> #include<…