上位机图像处理和嵌入式模块部署(树莓派4b和pyqt5界面开发)

news2024/12/23 19:23:02

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

  

        在大部分linux程序开发中,一般是没有界面的。不过不排除有些场合,是需要用界面进行数据交互、调参使用的。这种情况下一般就用pyqt5做一个简单的界面就可以。特别是功能比较单一的时候,如果还要花大量的时间去做界面相关的工作,往往是得不偿失的。加之对于树莓派4b这样的界面,直接用mobaxterm可以直接进行界面开发,非常方便。

1、安装pyqt5

        在树莓派4b上面安装pyqt5,只需要一条命令就可以了,

sudo apt-get install python3-pyqt5

2、测试方法

        这个时候测试界面,很多同学希望可以有一个屏幕进行开发。其实这是不需要的。我们需要的只是一个mobaxterm软件。这样哪怕直接输入python demo.py也就是在pc电脑上显示出对应的效果。

3、第一个测试程序

        本着耳听为虚、眼见为实的原则,我们编写第一个程序demo.py程序,

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox

class DemoApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(100, 100, 300, 200)  # Set window size and position
        self.setWindowTitle('PyQt5 Demo')  # Set window title

        # Create a button
        self.button = QPushButton('Click Me', self)
        self.button.setGeometry(100, 50, 100, 30)  # Set button size and position
        self.button.clicked.connect(self.showMessageBox)  # Connect button click event to function

    def showMessageBox(self):
        # Show a message box when the button is clicked
        QMessageBox.information(self, 'Message', 'Button Clicked!')

if __name__ == '__main__':
    # Create the PyQt5 application
    app = QApplication(sys.argv)
    # Create and show the demo application window
    demo = DemoApp()
    demo.show()
    # Run the application event loop
    sys.exit(app.exec_())

        程序比较简单,就是显示一个按钮,单击按钮后,有一个弹窗。效果如下所示,

4、第二个测试程序

        和第一个测试程序相比较,这一次多了一个菜单,我们来看看菜单时怎么做的,姑且暂时文件命名为menu.py,

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QMenu

class MenuDemo(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('PyQt5 Menu Demo')
        self.setGeometry(100, 100, 400, 300)

        # Create actions for the File menu
        file_menu = self.menuBar().addMenu('File')
        new_action = QAction('New', self)
        new_action.triggered.connect(self.newFile)
        file_menu.addAction(new_action)

        exit_action = QAction('Exit', self)
        exit_action.triggered.connect(self.close)
        file_menu.addAction(exit_action)

        # Create actions for the Edit menu
        edit_menu = self.menuBar().addMenu('Edit')
        cut_action = QAction('Cut', self)
        cut_action.triggered.connect(self.cutText)
        edit_menu.addAction(cut_action)

        copy_action = QAction('Copy', self)
        copy_action.triggered.connect(self.copyText)
        edit_menu.addAction(copy_action)

    def newFile(self):
        print("New File created.")

    def cutText(self):
        print("Text cut.")

    def copyText(self):
        print("Text copied.")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = MenuDemo()
    demo.show()
    sys.exit(app.exec_())

        代码执行后,效果是这样的,

5、第三个测试程序

        第三个测试是关于定时器的,就两个按钮,一个是开始,一个是结束。暂时把这个文件命名为timer.py,


import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton
from PyQt5.QtCore import QTimer, QTime, Qt

class TimerDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('PyQt5 Timer Demo')
        self.setGeometry(100, 100, 300, 200)

        self.label = QLabel('00:00:00', self)
        self.label.setAlignment(Qt.AlignCenter)

        self.start_button = QPushButton('Start', self)
        self.start_button.clicked.connect(self.startTimer)

        self.stop_button = QPushButton('Stop', self)
        self.stop_button.clicked.connect(self.stopTimer)

        layout = QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.start_button)
        layout.addWidget(self.stop_button)

        self.setLayout(layout)

        self.timer = QTimer()
        self.timer.timeout.connect(self.updateTime)

        self.elapsed_time = QTime()

    def startTimer(self):
        self.timer.start(1000)  # Timer triggers every 1000ms (1 second)
        self.elapsed_time.start()

    def stopTimer(self):
        self.timer.stop()

    def updateTime(self):
        elapsed = int(self.elapsed_time.elapsed() / 1000)  # Elapsed time in seconds
        time_display = QTime(0, 0).addSecs(elapsed).toString('hh:mm:ss')
        self.label.setText(time_display)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = TimerDemo()
    demo.show()
    sys.exit(app.exec_())


        整个程序运行起来的效果是这样的,

6、总结

        如果我们开发的重点是算法和驱动程序,那么不需要在linux界面耽误太多的时间。或者说,即使是编写界面,也是在windows上位机上面开发界面,而不是现在的linux上面开发。

        当然,如果真的用pyqt5做最终的产品开发也是可以的。需要做的,就是美工、布局上优化一下,增加一下开机启动,并且做到全屏显示就可以了。实际上,pyqt5的功能还是非常多的,建议大家可以好好使用一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1638904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript+B/S版云LIS系统源码ASP.NET CORE 3.1 MVC云LIS系统如何实现样本追踪的预警功能?医院云LIS检验系统源码

JavaScriptB/S版云LIS系统源码ASP.NET CORE 3.1 MVC云LIS系统如何实现样本追踪的预警功能?医院云LIS检验系统源码 实验室信息管理系统(Trasen Laboratory Information Management System)是一套专业的医疗实验室信息管理软件,包含…

远程链接linux

远程连接 ssh 远程登录操作,ssh会对用用户进行身份信息的验证,会对两台主机之间发通信数据进行加密 安装 ssh 远程登录的服务端 yum install -y openssh-server启动 ssh 服务 systemctl start ssh.service 关闭 ssh 服务 systemctl stop ssh.service …

伦敦金的交易时间段都适合投资吗?

是所有的交易时间段都适合投资。首先,让我们了解伦敦金的交易时间。伦敦金市场的交易时间分为两个主要时段:亚洲盘和欧美盘。亚洲盘通常在北京时间早晨6点至下午5点半左右,而欧美盘则从北京时间晚上8点半开始,一直到次日早晨4点半…

tomcat篇-windows 运行tomcat的startup.bat时,终端打印的中文显示为乱码

当运行Tomcat的startup.bat时,如果终端中中文显示为乱码,这通常是因为Tomcat使用的日志输出编码与Windows命令行默认的编码不匹配。针对这一问题,你可以尝试以下步骤来解决: 1、执行startup.bat,在输出的窗口右击&…

HCIP第二节

OSPF:开放式最短路径协议(属于IGP-内部网关路由协议) 一。OSPF的数据包类型 3层报头 协议号89 1.Hello:周期收发,用于邻居发现,关系建立,周期保活-10s/30s(路由之间相互认识&#…

如何搭建本地的 NPM 私有仓库 Nexus

NPM 本地私有仓库,是在本地搭建NPM私有仓库,对公司级别的组件库进行管理。在日常开发中,经常会遇到抽象公共组件的场景,在项目内部进行公用。新的项目开始时,也会拷贝一份创建一个新的项目,这样做不易于管理…

Day23.一刷数据结构算法(C语言版) 39组合总和;40组合总和II;131分割回文串

一、39组合总和 本题是集合里元素可以用无数次,那么和组合问题的差别,其实仅在于对startIndex上的控制 题目链接:组合总和 文章讲解:代码随想录 视频讲解:带你学透回溯算法-组合总和 (39.组合总和&#xff…

react核心知识

1. 对 React 的理解、特性 React 是靠数据驱动视图改变的一种框架,它的核心驱动方法就是用其提供的 setState 方法设置 state 中的数据从而驱动存放在内存中的虚拟 DOM 树的更新 更新方法就是通过 React 的 Diff 算法比较旧虚拟 DOM 树和新虚拟 DOM 树之间的 Chan…

界面组件DevExpress Blazor UI v23.2 - 网格、工具栏功能全新升级

DevExpress Blazor UI组件使用了C#为Blazor Server和Blazor WebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生Blazor UI组件(包括Pivot Grid、调度程序、图表、数据编辑器和报表等)。 DevExpress Blazor控件目前已经升级…

创新指南|如何通过用户研究打造更好的人工智能产品

每个人都对人工智能感到兴奋,但对错过机会 (FOMO) 的恐惧正在驱使公司将人工智能嵌入到每个产品功能中。这可能会导致以技术为中心的方法,从而掩盖产品开发的基本目标:创建真正解决用户问题并满足他们需求的解决方案。本文将介绍通过用户研究…

找不到msvcr100.dll怎么办,轻松解决msvcr100.dll丢失的5种方法

在我们日常与电脑相伴的工作与学习过程中,偶尔会遇到一些让人措手不及的软件运行问题。其中之一就是“msvcr100.dll丢失”。这个错误通常会导致某些程序无法正常运行。为了解决这个问题,本文将介绍5种常见的解决方法,帮助大家快速恢复程序的正…

Intelij Idea Push失败,出现git Authentication failed(验证失败)

目录 1、出现问题的原因 2、解决之法 1、出现问题的原因 能出现这种问题,最主要的原因是链接对上了,但用户验证失败了,即登录失败。 因为服务器转移或者换了git项目链接,导致你忘记了用户名密码,随意输入之后&…

Golang | Leetcode Golang题解之第58题最后一个单词的长度

题目: 题解: func lengthOfLastWord(s string) (ans int) {index : len(s) - 1for s[index] {index--}for index > 0 && s[index] ! {ansindex--}return }

【Docker】docker部署lnmp和搭建wordpress网站

环境准备 docker:192.168.67.30 虚拟机:4核4G systemctl stop firewalld systemctl disable firewalld setenforce 0 安装docker #安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像 yum-config-manager --add…

Recruit App

招聘类APP小程序

调教AI给我写了一个KD树的算法

我不擅长C,但是目前需要用C写一个KD树的算法。首先我有一份点云数据,需要找给定坐标范围0.1mm内的所有点。 于是我开始问AI,他一开始给的答案,完全是错误的,但是我一步步给出反馈,告诉他的问题,…

机器学习-06-聚类算法总结

聚类总结 1.聚类 机器学习 任务 聚类 无label的 分类 label是离散的 回归 label是连续的 2.聚类算法-kmeans 划分聚类 思想: D中选取k个作为初始质心 repeat 计算所有点与质心的距离,分到近的质心簇 更新簇之间的质心 until 质心不改 不足&#xff…

TCP协议为什么使用三次握手进行连接?

回答: TCP协议使用三次握手来建立一个可靠的连接,确保两端的通信设备都准备好进行数据传输。这个过程涉及三个步骤: SYN:客户端发送一个SYN(同步序列编号)包到服务器,以开始新的连接。SYN-ACK:…

0418EmpTomCat项目 初次使用ajax实现局部动态离职

0418EmpTomCat项目包-CSDN博客 数据库字段: 员工部门表 分页查询; 多条件查询; 添加新员工; ajax点击离职操作效果:

什么是限流?常见的限流算法

目录 1. 什么是限流 2. 常见限流算法 3. 固定窗口算法 4. 滑动窗口算法 5. 漏桶算法 6. 令牌桶算法 7. 限流算法选择 1. 什么是限流 限流(Rate Limiting)是一种应用程序或系统资源管理的策略,用于控制对某个服务、接口或功能的访问速…