python实现九宫格的车辆路径轨迹上位机界面

news2024/9/28 23:35:52

实验环境:wxFormBuilder v3.5 + python3.7.5 + MC9S12G128开发板

基本功能:控制开发板上的按键,模拟车辆移动的上下左右四个方位,通过can通信告诉上位机界面,车辆轨迹的移动方位;

1. python重新封装controlcan接口函数

参考本人写的文章:python调用32位的ControlCan.dll实现can报文的收发

2. 上位机程序开发过程中遇到的问题及解决思路

MC9S12G128开发板—实现按键发送CAN报文指示小车移动功能

本人写的下面这篇文章也记录了上位机程序开发过程中遇到的一些问题及解决思路:
MC9S12G128开发板—解决小车九宫格方位移动功能实现遇到的一些问题

2.1 问题Q1:界面卡死

在这里插入图片描述

解决界面卡死的方法请查看本人写的这篇文献,文章链接:https://blog.csdn.net/Logintern09/article/details/122448199

2.2 问题Q2:小车图像显示错位问题

在这里插入图片描述

原界面程序代码:

class MyFrame(wx.Frame):

    def __init__(self, parent):
        wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition,
                          size=wx.Size(874, 656), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)

        self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)

        bSizer = wx.BoxSizer(wx.VERTICAL)

        bSizer4 = wx.BoxSizer(wx.VERTICAL)

        bSizer8 = wx.BoxSizer(wx.HORIZONTAL)

        m_choice1Choices = [u"索引0", u"索引1"]
        self.m_choice1 = wx.Choice(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_choice1Choices, 0)
        self.m_choice1.SetSelection(0)
        bSizer8.Add(self.m_choice1, 0, wx.ALL, 5)

        m_choice2Choices = [u"250Kbps", u"500Kbps"]
        self.m_choice2 = wx.Choice(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_choice2Choices, 0)
        self.m_choice2.SetSelection(0)
        bSizer8.Add(self.m_choice2, 0, wx.ALL, 5)

        self.m_button1 = wx.Button(self, wx.ID_ANY, u"连接", wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer8.Add(self.m_button1, 0, wx.ALL, 1)

        m_radioBox1Choices = [u""]
        self.m_radioBox1 = wx.RadioBox(self, wx.ID_ANY, u"", wx.DefaultPosition, wx.DefaultSize,
                                       m_radioBox1Choices, 1, wx.RA_SPECIFY_COLS)
        self.m_radioBox1.SetSelection(0)
        bSizer8.Add(self.m_radioBox1, 0, wx.ALL, 5)

        self.m_button2 = wx.Button(self, wx.ID_ANY, u"开始", wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer8.Add(self.m_button2, 0, wx.ALL, 1)

        bSizer4.Add(bSizer8, 1, wx.EXPAND, 5)

        bSizer9 = wx.BoxSizer(wx.VERTICAL)

        self.m_textCtrl1 = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(20, 200),
                                       wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_RICH2)
        bSizer9.Add(self.m_textCtrl1, 0, wx.EXPAND, 20)

        bSizer4.Add(bSizer9, 3, wx.EXPAND, 5)

        bSizer.Add(bSizer4, 2, wx.EXPAND, 5)

        bSizer1 = wx.BoxSizer(wx.HORIZONTAL)

        self.m_bitmap1 = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer1.Add(self.m_bitmap1, 1, wx.EXPAND, 5)

        self.m_bitmap2 = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer1.Add(self.m_bitmap2, 1, wx.EXPAND, 5)

        self.m_bitmap3 = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer1.Add(self.m_bitmap3, 1, wx.EXPAND, 5)

        bSizer.Add(bSizer1, 1, wx.EXPAND, 5)

        bSizer2 = wx.BoxSizer(wx.HORIZONTAL)

        self.m_bitmap4 = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer2.Add(self.m_bitmap4, 1, wx.EXPAND, 5)

        self.m_bitmap5 = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer2.Add(self.m_bitmap5, 1, wx.EXPAND, 5)

        self.m_bitmap6 = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer2.Add(self.m_bitmap6, 1, wx.EXPAND, 5)

        bSizer.Add(bSizer2, 1, wx.EXPAND, 5)

        bSizer3 = wx.BoxSizer(wx.HORIZONTAL)

        self.m_bitmap7 = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer3.Add(self.m_bitmap7, 1, wx.EXPAND, 5)

        self.m_bitmap8 = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer3.Add(self.m_bitmap8, 1, wx.EXPAND, 5)

        self.m_bitmap9 = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer3.Add(self.m_bitmap9, 1, wx.EXPAND, 5)

        bSizer.Add(bSizer3, 1, wx.EXPAND, 5)

        self.SetSizer(bSizer)
        self.Layout()

        self.Centre(wx.BOTH)

解决思路:后面采用面板Panel重新放置StaticBitmap控件的方式成功解决了上图所示的小车图片显示错位问题。

3. 上位机程序源码下载地址

python实现九宫格的车辆路径轨迹上位机程序下载地址:https://download.csdn.net/download/Logintern09/87800717

参考文献

wxpython中多线程的实现:https://wenku.baidu.com/view/e3a978f2c2c708a1284ac850ad02de80d4d806a5.html
如何使用pyinstaller打包32位的exe程序:
http://www.zzvips.com/article/174280.html

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

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

相关文章

技巧:jetbrain全家桶系列如何撤销已经提交本地仓库但还没push的commit

目录 1. 哎呀,不小心把不能提交的“机密”加入commit了2. 使用reset来修复的话要注意有坑,选Soft和Mixed,千万别选Hard和Keep3. 使用revert,只能修修补补,但commit还在,当然有好处是会留下使用痕迹&#xf…

异常处理机制

编程错误 编写程序时遇到的错误可大致分为 2 类,分别为语法错误和运行时错误。 语法错误 语法错误,也就是解析代码时出现的错误。当代码不符合Python语法规则时,Python解释器在解析时就会报出SyntaxError语法错误,与此同时还会…

服务(第二十六篇)redis的主从复制、哨兵、集群

主从复制: 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的,只能由主节点到从节点。 原理: 主从关系确定…

[算法前沿]--009-HuggingFace介绍(大语言模型底座)

基础介绍 HuggingFace 是一家专注于自然语言处理(NLP)、人工智能和分布式系统的创业公司,创立于2016年。最早是主营业务是做闲聊机器人,2018年 Bert 发布之后,他们贡献了一个基于 Pytorch 的 Bert 预训练模型,即 pytorch-pretrained-bert,大受欢迎,进而将重心转向维护…

PoseiSwap以2500万美元估值,再获新一轮融资

近日,Nautilus Chain 上的首个 DEX PoseiSwap 宣布,其目前已经以 2500 万美元的估值,从 Gate Labs、Emurgo Ventures、Republic以及Cipholio Ventures 等行业顶级投资机构中,获得了新一轮的融资,不过目前该融资的具体数…

asp.net网上捐赠系统

一该源码功能十分的全面,具体介绍如下: 本版本软件主要完成三个功能: 1、建立网上捐赠功能 实现网上捐赠程序自动化,智能化,在捐赠者与受捐者填写各种资料后,自动保存方便以后调阅查询&#xff0c…

Java【网络编程1】详解DatagramSocket和DatagramPacket类, 逐行代码解析如何服务器客户端通信(附代码)

文章目录 前言一、认识 Socket(套接字), TCP 协议和 UDP 协议1, 什么是 Socket(套接字)2, 浅谈 TCP 协议和 UDP 协议的区别和特点 二、基于 UDP 协议的 Socket API1, DatagramSocket 类2, DatagramPacket 类 三、逐行代码解析网络编程1, 逐行解析客户端1.1, 核心成员方法 start…

【C++】-类和对象完结(内部类、匿名对象以及编译器的优化的讲解)(下)

💖作者:小树苗渴望变成参天大树 ❤️‍🩹作者宣言:认真写好每一篇博客 💨作者gitee:gitee 💞作者专栏:C语言,数据结构初阶,Linux,C 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 …

m1安装svn

背景:电脑是mac m2,好多软件都不太兼容,安装软件成了一个问题,想着装一个SVN,跟大家一起协同开发,这下可麻烦死了,😄,终于弄明白用brew命令了,然后就用brew命…

Metasploitable2靶机渗透学习

目录 一、介绍 二、环境 三、渗透攻击 1.前期渗透 1.1主机发现 1.2.端口扫描 1.3.测试漏洞 2.弱密码漏洞 2.1系统弱密码登录(telnet :23端口) 2.2 MySQL弱密码登录(端口:3306) 2.3 PostgreSQL弱…

K8s全套快速入门

K8s快速入门 1 介绍 google开源的容器化管理工具机器数量十几台、上百台时,就可以考虑使用k8s高可用、自动容灾恢复、灰度更新、一键回滚历史版本、方便伸缩扩展等 k8s集群架构: 通常:一主多从 master:主节点,控制平台…

LeetCode 栈和队列OJ题目分享

目录 有效的括号(括号匹配)用栈实现队列用队列实现栈设计循环队列 有效的括号(括号匹配) 链接: link 题目描述: 题目思路: 1、如果是左括号“( { [ ”就入栈 2、如果是右括号“) }…

Redis--弱口令未授权访问漏洞

Redis--弱口令未授权访问漏洞 一、漏洞简介二、危险等级三、漏洞影响四、入侵事件五、漏洞复现--Redis CrackIT入侵事件5.1、以root启动的redis,可以远程登入到redis console--------A主机5.2、生成公钥5.3、执行: redis-cli flushall 清空redis(非常暴力&#xff0…

2023年春秋杯网络安全联赛 春季赛 wp

文章目录 Cryptocheckinbackdoor WebPhpstudyEasypyezrustqqcms MISCSudohappy2forensic盲人会藏在哪里piphackwordle PWNp2048easy_LzhiFTP_CHELL Crypto checkin 第一部分求解一下pell函数得到x,y def solve_pell(N, numTry 100):a[]b[]cf continued_fraction(sqrt(N))f…

C++的priority_queue

priority_queue 1.priority_queue的介绍2.priority_queue的使用3.priority的模拟实现 1.priority_queue的介绍 优先队列是一种堆,默认是大根堆,可以通过greater的仿函数可以建立小根堆empty():检测容器是否为空 size():返回容器中…

【密码学复习】第七章 公钥加密体制(二)

RSA单向陷门函数及其应用 ElGamal单向陷门函数 1)密钥生成 ① 选择一大素数p,选取Zp * 的生成元g ; ② 任选小于p的随机数x,计算y≡g x mod p; ③(y, g, p)为公开密钥, (x, g, p)为秘密密钥. 2)加密:设待加密…

asp.net就业满意度问调查系统

本系统主要有会员(调查者)和管理员,他们具体的功能如下: 会员功能:注册,登录,修改个人信息,调查,查看调查结果及影响,留言,首先是会员注册,注册后…

【Web开发】Node实现Web图表功能(ECharts.js,React)

🎈🎈🎈Python实现Web图表功能系列:🎈🎈🎈1🎈【Web开发】Python实现Web图表功能(D-Tale入门)🎈2🎈【Web开发】Python实现Web图表功能&a…

整理了一份github上比较热门的ChatGPT项目,值得收藏

ChatGPT已经火了一段时间了,但是,热度依旧是各大自媒体的热榜。由于,国内不能直接访问ChatGPT,国内的开发者依托OpenAI的接口,开发出一些ChatGPT的应用。今天就整理一下github上最热门的ChatGPT项目。 lencx/ChatGPT 该项目是Cha…

java线程的状态

文章目录 1. 线程的状态2. 验证NEW、RUNNALE和TERMINATED状态3. 验证TIMED_WAITING状态4. 验证BLOCKED状态5. 验证BLOCKED状态 1. 线程的状态 线程在不同的运行时期存在不同的状态,状态信息存在于State枚举类中,如下图: 调用线程有关的方法是…