7. GUI库 - PyQt5¶
平台:鲁班猫
系统:Debian
Python版本:Python3.7
PyQt版本:PyQt5
7.1. PyQt5库简介¶
PyQt是Qt应用框架与Python的结合,同时支持Python2.x和Python3.x版本,本教程使用的是Python3.7版本,PyQt5版本。
PyQt5是由一系列Python模块组成,超过620个类,6000函数和方法。能在诸如Unix、Windows和Mac OS等主流操作系统上运行,而且由于Python语言的开发方便性,在编写代码时比C++更为方便,美中不足的是Python语言的执行效率会比C++慢。
7.2. PyQt5库安装¶
7.2.2. 依赖库安装¶
最后安装一些依赖的deb包,它主要是用于提供tslib触摸、中文字库等功能:
sudo apt-get -y install libts-bin devscan ebf-tslibplugin ebf-fonts
然后运行:
sudo depmod -a
最后重启开发板,这样子环境就搭建完成。
接下来我们测试一下PyQt5在开发板上的运行。
重要
实验前请确保LCD驱动及触摸屏驱动的设备树插件已经开启,前面章节有述。
7.3. PyQt5库使用¶
首先编写一个名字为pyqt5_demo.py的PyQt5应用程序,它主要是用于测试显示、触摸、信号、槽函数、以及PyQt5的部分组件如:QWidget、QLCDNumber、QSlider、QVBoxLayout等的简单使用,虽然是很简单的程序,但足以满足我们的测试,这样子就能说明野火开发板的Debian系统是可以运行PyQt5的,并且可以通过它看出PyQt5的执行效率,目前我的测试还是可以非常快响应的。
pyqt5_demo.py代码如下:
import sys
from PyQt5.QtWidgets import QWidget,QLCDNumber,QSlider,QVBoxLayout,QApplication
from PyQt5.QtCore import Qt
class WinForm(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
#1 先创建滑块和 LCD 部件
lcd = QLCDNumber(self)
slider = QSlider(Qt.Horizontal, self)
slider.setMaximum(1000)
lcd.display(666)
slider.setValue(666)
#2 通过QVboxLayout来设置布局
vBox = QVBoxLayout()
vBox.addWidget(lcd)
vBox.addWidget(slider)
self.setLayout(vBox)
#3 valueChanged()是Qslider的一个信号函数,只要slider的值发生改变,它就会发射一个信号,然后通过connect连接信号的接收部件,也就是lcd。
slider.valueChanged.connect(lcd.display)
slider.setMinimumWidth(200)
slider.setFixedHeight(60)
style = "QSlider::groove:horizontal {border:1px solid #999999;height:10px;" \
"background-color:#666666;margin:2px 0;}" \
"QSlider::handle:horizontal {background-color:#ff0000;border:1px solid #797979;" \
"width:50px;margin:-20px;border-radius:25px;}" \
slider.setStyleSheet(style);
#self.setGeometry(0,0,800,480)
self.setWindowTitle("拖动滑块LCD显示")
if __name__ == '__main__':
app = QApplication(sys.argv)
form = WinForm()
form.resize(800, 480)
form.show()
sys.exit(app.exec_())
然后创建一个run.sh脚本,通过它来运行我们的pyqt5_demo.py,为什么需要一个脚本呢,是因为我们需要导出相关的环境变量,比如显示、触摸等环境变量,这个脚本需要使用sudo权限运行。
run.sh脚本内容如下:
#! /bin/bash
if [ ! $1 ]; then
echo "- usage;"
echo "- sudo ./run_pyqt5.sh xxx"
echo "- xxx is your pyqt5_demo.py"
exit
else
echo "current pyqt $1"
fi
type devscan
#判断devscan是否存在,不存在提示安装
if [ $? -eq 0 ]; then
#未检查到触摸屏则一直检测不启动app
timeout=0
while [ ! $eventx ]
do
#寻找名叫goodix-ts的触摸屏驱动
eventx=$(devscan "goodix-ts")
#没有找到则寻找Goodix Capacitive TouchScreen
if [ ! $eventx ]; then
eventx=$(devscan "Goodix Capacitive TouchScreen")
fi
#没有找到则寻找iMX6UL Touchscreen Controller
if [ ! $eventx ]; then
eventx=$(devscan "iMX6UL Touchscreen Controller")
fi
########################################################
# 添加你自己的显示屏驱动
# 首先 sudo evtest 查看是否存在显示屏驱动
# 存在添加类似于上面的判断 改为你自己的显示屏驱动名称
########################################################
if [ $timeout -ge 5 ]; then
break
fi
let timeout=$timeout+1
sleep 1
done
#输出当前触摸屏驱动
echo "eventx=$eventx"
if [ "$eventx " != " " ]; then
#判断触摸屏校准文件是否存在,不存在则校准触摸屏,/etc/pointercal为触摸屏校准文件
if [ ! -f "/etc/pointercal" ]; then
#指定触摸屏设备
export TSLIB_TSDEVICE=/dev/input/$eventx
type ts_calibrate
if [ $? -eq 0 ]; then
ts_calibrate
fi
fi
#同步QT默认的坐标轴和触摸屏的坐标轴
#export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/$eventx:rotate=90:invertx
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/$eventx:rotate=0
else
echo "eventx is null"
fi
else
echo "please install devscan"
echo
echo "sudo apt-get install devscan"
exit
fi
#导出qtdemo的安装目录
export APP_DIR=/usr/local/qt-app
#指定qt插件路径
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/plugins
#指定qt库路径
#export LD_LIBRARY_PATH=/lib:/usr/lib
#指定字体库
export QT_QPA_FONTDIR=/usr/lib/fonts
#qt命令路径
#export PATH=$PATH:$QT_DIR/libexec
#指定显示终端
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
#禁用QT自带的输入检测
#export QT_QPA_FB_DISABLE_INPUT=1
#TS配置文件
export TSLIB_CONFFILE=/etc/ts.conf
#TS校准文件
export TSLIB_CALIBFILE=/etc/pointercal
#触摸配置
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/$eventx
#指定鼠标设备
export QWS_MOUSE_PROTO=tslib
#启用tslib支持而不是依赖于Linux多点触控协议和事件设备
export QT_QPA_EGLFS_TSLIB=1
export QT_QPA_FB_TSLIB=1
#运行App
echo "start pyqt5 demo..."
python3 $1
赋予脚本可执行权限:
chmod +x run.sh
运行:
sudo ./run.sh pyqt5_demo.py
效果:
大家可以将配套代码目录 libdemo\PyQt5\pyqt5_demo.py及run.sh文件,上传到开发板中测试。