内容
本文介绍:使用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,定时器停止工作
完
课程作业,边学边用,如有错漏,敬请指正
参考:
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