self

很多事情不需要考虑如何开始,真正回想起来的时候发现自己已经在路上了.

记得若干年前,似乎也不是太远.一个连触摸板都不好使的笔记本,没有散热垫几乎无法持续工作.依然坚持不懈的玩命似的配合我工作. 那时候一个微小的按钮图片, 都要筛选上好几天. 任何角度都想完全透露出产品的良苦用心. 任何情况都要考虑到位,唯恐别人误解了产品意图.

渐渐的,称赞多了.机会也就多了. 还是那句话"机会是给有准备的人的".那时候我准备好了么? 我自认为好了吧. 这就是因果关系. 机会会越来越多.但是要学会取舍. 希望我明白的不是太晚.

现在在看看, 产品是要给人用的. 至少要用的赏心悦目吧. 结果一个个只有功能没有皮肉的孵化期工具就一件件的流传出去. 美其名曰只用来解决问题, 不需要看着舒服. 在别人忍受着高难度的视觉摧残,又坚持着用蹩脚的操作方式去解决一个个现实问题的时候.那种感觉,应该是如何?痛苦并快乐着?还是和SM一样的效果?

这TMD真不是我喜欢的!

N年前,那时候梦想真简单,觉得等个几年换上一台W510那该多爽.8CPU,16G内存啊.妈妈再也不用担心我的散热问题. 结果发现千万别给自己制定什么5年计划10年计划. 世界永远不会随着自己的想法走.残忍的事实告诉我只用了一年就有了W510还是32G内存两块硬盘的.那时候的日子也算轻松,每天背着23斤的电脑来回穿梭在我不太喜欢的北方城市. 虽然每天不在担心温饱,也渐渐走向小资群体.依然会习惯的考虑做公交比地铁划算.但是往往客户一个电话我首先考虑打车去解决问题.那时候想法简单啊"产品是我的,我要对我的东西负责!不论代价!" 看看现在, 我哪里还拿得出这种态度对待生活.这就是退步吧. 希望明白的不是太晚.

即时现在W510已经不用了. 我还是保留着.

N-1年前,那时候还不懂得什么是拒绝.任何问题来者不拒, 从来没考虑过回报问题. 什么要求全都答应, 也从来不记得自己会付出什么. 生活大概就是"吃饭" "睡觉" "工作" "回家工作". 不少人跟我说过, 你这样会很累, 傻了吧唧. 也有人很直接的表达 你就是个傻逼似得. 也许是善意的提醒,也许是同行业的嫉妒. 往往这些人都不如我混得好, 但是往往丫们比我轻松. 我依然觉得这种方式才有趣. 确实, 很傻逼的做法,获得了超出预期的东西. 也许是事业, 也许是责任, 也许是票子. 但是我还是只在意我做出来的东西好不好, 是不是看上去就很爽... 我想要的很简单, 希望越来越多的人用的是我的东西, 并且称赞它. 现在我要找回这种感觉, 希望明白的不是太晚.

我的东西都舍不得扔, 硬盘也都还留着. 也许很多都坏了...

N-2年前, 一直埋头干事的状态下, 偶尔抬次头才发现我被世界选中了.. 我很坦然.当然, 这是意淫. 我的运气和能力永远不会被世界选中. 我最多是被公司选中了. 还挺多. 有人情, 有客户, 也有朋友. 那时候,还是不懂得拒绝, 更不懂得选则. 最后, 盛情之下还是选择了钱最多的公司.废话,这时候不看钱看什么.给得起钱就代表给得起平台. 结果发现, 果然没选错. 新的环境,新的角色.新的技术.只有我自己还是老的态度. 现实情况却是引得越来越多人的不满. 不明白的就是为什么更拼命的努力会适得其反. 慢慢,我懂了什么是树大招风. 更知道,做事要考虑大多数人的利益. 作为一个软件开发者, 也逐渐懂得,视觉上的东西不是那么重要.有了功能, 自然会有人来帮你打扮. 如此以来, 我的路子变了很多. 不再考虑产品的可观性, 也渐渐的把我的产品,变成了我们的产品,最后变成了公司的产品.相应的, 责任心就下降了, 各司其职的规则也在潜意识里形成. 我以为自己要做的就是保证自己的东西不出问题. 而忘了精益求精, 忘了自己想走的路. 为了寻求保障, 只能竟可能的提高自己,不仅仅是技术水平. 更重要的是全局观,更要理解市场路线. 企业告诉我, 软件的目的是为了变钱, 因为没有钱你拿什么来做软件. 恰恰, 我的年龄到了考虑生活的时候, 也渐渐感觉到了房子的压力, 也感觉到了交通的不便, 更感觉到了身体的不适. 也许,真的就是为了钱吧. 于是, 工作开始考虑成本, 付出也变得获取价值, 似乎劳动都要是有回报的. 这时候周围的事物倒是反了过来, 好像所有人都开始倒贴这我, 即使漫天要价也会有人附和. 想想人真是贱啊, 好心帮你的时候你丫不领情, 现在要你丫花钱了你倒是高兴了. 这是人性?还是社会规则? 既然有钱就不会错吧. 我大步的向前走着, 羡慕的人越来越多. 我却忘了回想我最想要什么. 茫然惊醒,希望明白的不是太晚.

N-3年前, 凭证自己的职位, 加上摆得上台面的技术, 带着一群软件工人, 做起了包工头才会干的活. 对外而言, 我们是个团队, 口碑良好,技术过硬. 利用各种资源赚着各种容易和不容易的钱. 开始懂得资源分配, 开始考虑成本规划. 开始变得精打细算. 也开始忽略能忽略的东西, 提高交易的金额和数量. 对内,我们无非朋友三五个, 搭伙干活. 有钱大家分,有事我一个人抗, 一年到头电话不断, 很荣幸的被联通直接升级到了钻石级用户.除了每个月的电话费在4位数以上以外,唯一的收获就是去机场和车站都有VIP休息室可以座. 我倒自认为感觉良好, 以为这就是事业的开始. 实则, 一个因为利益聚集在一起的团队, 必然会因为利益分开. 否则就是因为没有了利益而分开. 而我也总是大家意识里面抗事的那位. 理所当然, 圈子变了, 也就意味着开销变了, 赚着别人几年才赚得到的钱, 同时也花着别人几年都舍不得花的钱. 等我把所有的屁股都搽干净以后,回头想想.往往软件是个细活,不能"精打细算"; 其实,车子,房子早该有了.... 现在发现, 陪着我的是好多台电脑, 有的比W510还好. 还有就是重了40斤的体重. 最累的几年, 回想起来却最没有事情可以回忆. 几年下来, 我丢失了很重要的东西. 我为什么做这些事情, 想要什么结果? 这些好像没考虑太好.希望这次我是真的考虑好了.

空白了很久, 确实不太记得时间有多久了. 只是好像总是少了点什么, 我也明白应该为什么做. 也一直在做.结果缺一直不如人意. 即使得到别人的称赞也不是我想要的那种.

社会会改变一个人,其实是人一直在改变自己, 改变自己去迎合这个社会. 其实这没什么错. 只是迎合的心态能决定最终事情的走向. 这和做爱是一样的, 是有了爱才能去做, 如果你迎合的那个人怀了孕; 你爱她,这就是爱的结晶;你不爱她这就是个麻烦. 所以为了少给自己添麻烦,最好想好了选对了再做.

于是,我就开始考虑,怎么选才是对的.要先想好了再干!

考虑了不少时间,觉得没啥可考虑的, 干了再说, 不行再来.为了不给自己添麻烦,就要小心意义的干,运气好就干好了运气不好也不至于有什么后果. 这就相当于带了安全套, 注重过程,而且提升经验. 大家都放心.当然也不可能有什么大的成果.最多就是技能提升.

不知道尝试了多久, 发现.技能提升了. 可是过程都像在练技能. 到现在, 技能到位了. 才发现, 心没了.这就相当于, 做爱少了前戏. 往往前戏对男人来说是个体力活. 但是它是必不可少的. 男人只有对爱的人才愿意给前戏. 这样结果才是你心中想要的. 如果心都没了, 干出来结果你也不定想要.

人做任何事情都是有目的的, 这个目的抽象来讲就是要满足自己心里所想. 心走了. 再别人看来再好的结果自己也不见得满意.不论位高权重,还是平淡度日,人都是为了一个个的贪念在努力.我渐渐也明白了一点点佛家人的心态, 他们淡化了外界对自己的引力,也收敛了自己的内心.也许他们来走一朝红尘是为了"观"这个世界?也许吧.

今年,回武汉已经半年过去了. 带着不走心的方式, 做了大大小小的事情. 也有不错的结果, 也有毫无收获. 很多事情别人会觉得不可思议, 但是我却一直平淡无奇. 今天一时醒悟. 我这是一直在拿着结果来尝试找出心里所想. 却发现所有结果都对不上. 现在才知道根本没走心. 不用心的结果 怎么会是心里想要所得的?

路还是要一步步的走, 一步一个脚印才能看清走的方向. 在合适的时间内做合适的事情, 任何超常规的事物都不稳定. 这些年丢失的恰恰都是对工作的那份认证和热忱. 习惯了各司其职的工作方式, 习惯了安排他人的工作方式. 突然发现自己在离开了平台以后没有保留住自己的独立完成事情的能力和习惯.事情是做给自己的. 要热情. 结果也是给自己的要用心. 其实并没有急着要结果, 只是习惯性的被社会环境影响了.这些年,不白费. 既然练好了技术,为何不带上自己最初的想法, 踏踏实实的走好每一步. 做好前戏, 再提枪上阵,枪杆子够硬, 技术够好不愁没有好的结果. 机会一直是给有准备的人的.

醍醐灌顶!
【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
首先的是一个数据采集处理和导出的程序import sys import time import random import pandas as pd from datetime import datetime from PyQt5.QtCore import QThread, pyqtSignal, QMutex, QWaitCondition, Qt from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QTableWidget, QTableWidgetItem, QProgressBar, QLabel, QMessageBox, QTextEdit, QListWidget, QSplitter, QListWidgetItem, QAbstractItemView) 线程安全的数据存储 class ThreadSafeDataStore: def init(self): self.data = [] self.mutex = QMutex() self.condition = QWaitCondition() def add_data(self, item): """添加数据(线程安全)""" self.mutex.lock() self.data.append(item) self.mutex.unlock() def get_all_data(self): """获取所有数据(线程安全)""" self.mutex.lock() data_copy = self.data[:] self.mutex.unlock() return data_copy def clear(self): """清空数据(线程安全)""" self.mutex.lock() self.data.clear() self.mutex.unlock() 数据采集线程 class DataCollectorThread(QThread): data_collected = pyqtSignal(dict) progress_updated = pyqtSignal(int) status_changed = pyqtSignal(str) def __init__(self, data_store): super().__init__() self.data_store = data_store self._is_paused = False self._is_running = False self.pause_condition = QWaitCondition() self.mutex = QMutex() self.sample_count = 0 # 样本计数器 def run(self): """线程主循环""" self._is_running = True self.sample_count = 0 while self._is_running: # 暂停处理 self.mutex.lock() if self._is_paused: self.status_changed.emit("采集已暂停") self.pause_condition.wait(self.mutex) self.mutex.unlock() # 模拟数据采集 self.sample_count += 1 timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") value = random.uniform(0, 100) temperature = random.uniform(20, 30) data_point = { "timestamp": timestamp, "sample_id": self.sample_count, "value": value, "temperature": temperature } # 保存数据并发送信号 self.data_store.add_data(data_point) self.data_collected.emit(data_point) self.progress_updated.emit(self.sample_count) self.status_changed.emit(f"采集样本 #{self.sample_count}") # 控制采集速度 time.sleep(0.5) def pause(self): """暂停采集""" self.mutex.lock() self._is_paused = True self.mutex.unlock() def resume(self): """恢复采集""" self.mutex.lock() self._is_paused = False self.pause_condition.wakeAll() self.mutex.unlock() def stop(self): """停止线程""" self._is_running = False self.resume() # 确保线程能退出 self.wait() def reset_counter(self): """重置样本计数器""" self.sample_count = 0 数据处理线程 class DataProcessorThread(QThread): processed_data = pyqtSignal(dict) status_changed = pyqtSignal(str) def __init__(self, data_store): super().__init__() self.data_store = data_store self._is_running = False def run(self): """线程主循环""" self._is_running = True while self._is_running: # 获取所有数据 data = self.data_store.get_all_data() if data: # 模拟数据处理:计算统计指标 values = [d['value'] for d in data] avg_value = sum(values) / len(values) max_value = max(values) min_value = min(values) result = { "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "samples": len(data), "avg_value": avg_value, "max_value": max_value, "min_value": min_value } # 发送处理结果 self.processed_data.emit(result) self.status_changed.emit(f"处理了 {len(data)} 个样本") # 控制处理频率 time.sleep(1) def stop(self): """停止线程""" self._is_running = False self.wait() 主窗口 class MainWindow(QMainWindow): def init(self): super().init() self.setWindowTitle(“多线程数据采集与分析系统”) self.setGeometry(100, 100, 1000, 700) # 测试计数器 self.test_counter = 1 # 历史测试数据存储 self.history_tests = {} # 创建共享数据存储 self.data_store = ThreadSafeDataStore() # 初始化线程 self.collector_thread = DataCollectorThread(self.data_store) self.processor_thread = DataProcessorThread(self.data_store) # 初始化UI self.init_ui() # 连接信号 self.connect_signals() def init_ui(self): """初始化用户界面""" # 主布局 main_widget = QWidget() main_layout = QVBoxLayout(main_widget) # 使用分割器使界面更灵活 splitter = QSplitter(Qt.Vertical) # 顶部控制面板 top_widget = QWidget() top_layout = QVBoxLayout(top_widget) # 控制面板 - 使用两行布局 control_layout = QVBoxLayout() row1_layout = QHBoxLayout() row2_layout = QHBoxLayout() # 第一行按钮 self.start_btn = QPushButton("开始采集") self.pause_btn = QPushButton("暂停采集") self.stop_btn = QPushButton("停止采集") # 第二行按钮 self.restart_current_btn = QPushButton("重新本次采集") self.restart_btn = QPushButton("重新采集") self.export_btn = QPushButton("导出选中数据") # 初始状态设置 self.pause_btn.setEnabled(False) self.stop_btn.setEnabled(False) self.restart_current_btn.setEnabled(False) self.restart_btn.setEnabled(False) self.export_btn.setEnabled(False) # 添加到布局 row1_layout.addWidget(self.start_btn) row1_layout.addWidget(self.pause_btn) row1_layout.addWidget(self.stop_btn) row2_layout.addWidget(self.restart_current_btn) row2_layout.addWidget(self.restart_btn) row2_layout.addWidget(self.export_btn) control_layout.addLayout(row1_layout) control_layout.addLayout(row2_layout) # 状态显示 status_layout = QHBoxLayout() self.status_label = QLabel("就绪") self.progress_bar = QProgressBar() self.progress_bar.setRange(0, 100) status_layout.addWidget(self.status_label, 3) status_layout.addWidget(self.progress_bar, 7) top_layout.addLayout(control_layout) top_layout.addLayout(status_layout) # 中部数据显示区域 center_widget = QWidget() center_layout = QHBoxLayout(center_widget) # 左侧:历史测试列表 history_layout = QVBoxLayout() history_layout.addWidget(QLabel("历史测试记录:")) self.test_list = QListWidget() self.test_list.setSelectionMode(QAbstractItemView.ExtendedSelection) # 允许多选 history_layout.addWidget(self.test_list) # 右侧:数据表格 data_layout = QVBoxLayout() # 原始数据表格 self.data_table = QTableWidget() self.data_table.setColumnCount(4) self.data_table.setHorizontalHeaderLabels(["测试时间", "测试次数", "指标1", "指标2"]) self.data_table.setMinimumHeight(200) # 处理结果表格 self.result_table = QTableWidget() self.result_table.setColumnCount(5) self.result_table.setHorizontalHeaderLabels(["处理时间", "样本数", "平均值", "最大值", "最小值"]) self.result_table.setMinimumHeight(150) data_layout.addWidget(QLabel("原始数据:")) data_layout.addWidget(self.data_table) data_layout.addWidget(QLabel("处理结果:")) data_layout.addWidget(self.result_table) center_layout.addLayout(history_layout, 1) center_layout.addLayout(data_layout, 3) # 底部:日志区域 bottom_widget = QWidget() bottom_layout = QVBoxLayout(bottom_widget) bottom_layout.addWidget(QLabel("操作日志:")) self.log_view = QTextEdit() self.log_view.setReadOnly(True) self.log_view.setMinimumHeight(100) bottom_layout.addWidget(self.log_view) # 组装分割器 splitter.addWidget(top_widget) splitter.addWidget(center_widget) splitter.addWidget(bottom_widget) splitter.setSizes([100, 400, 150]) # 设置各部分大小比例 main_layout.addWidget(splitter) self.setCentralWidget(main_widget) # 连接按钮信号 self.start_btn.clicked.connect(self.start_test) self.pause_btn.clicked.connect(self.toggle_pause) self.stop_btn.clicked.connect(self.stop_test) self.export_btn.clicked.connect(self.export_data) self.restart_current_btn.clicked.connect(self.restart_current) self.restart_btn.clicked.connect(self.restart_all) # 连接列表选择信号 self.test_list.itemSelectionChanged.connect(self.show_selected_test) def connect_signals(self): """连接线程信号到槽函数""" self.collector_thread.data_collected.connect(self.add_data_row) self.collector_thread.progress_updated.connect(self.update_progress) self.collector_thread.status_changed.connect(self.update_status) self.processor_thread.processed_data.connect(self.add_result_row) self.processor_thread.status_changed.connect(self.log_message) def start_test(self): """开始采集""" self.log_message("开始数据采集...") # 清空数据 self.data_store.clear() self.data_table.setRowCount(0) self.result_table.setRowCount(0) self.progress_bar.setValue(0) # 重置样本计数器 self.collector_thread.reset_counter() # 启动线程 if not self.collector_thread.isRunning(): self.collector_thread.start() if not self.processor_thread.isRunning(): self.processor_thread.start() # 更新UI状态 self.start_btn.setEnabled(False) self.pause_btn.setEnabled(True) self.stop_btn.setEnabled(True) self.restart_current_btn.setEnabled(True) self.restart_btn.setEnabled(True) self.export_btn.setEnabled(False) self.pause_btn.setText("暂停采集") def restart_current(self): """重新本次采集 - 清空当前数据但保持采集状态""" if not self.collector_thread.isRunning(): self.log_message("警告:采集未运行,无法重新本次采集") return self.log_message("重新本次采集...") # 清空当前数据 self.data_store.clear() self.data_table.setRowCount(0) self.result_table.setRowCount(0) self.progress_bar.setValue(0) # 重置样本计数器 self.collector_thread.reset_counter() self.log_message("已清空当前采集数据,继续采集...") def restart_all(self): """重新采集 - 停止当前采集并重新开始""" self.log_message("重新采集...") # 停止当前采集 if self.collector_thread.isRunning(): self.stop_test() # 开始新的采集 self.start_test() def toggle_pause(self): """切换暂停/继续状态""" if not self.collector_thread.isRunning(): self.log_message("警告:采集未运行,无法暂停") return if self.collector_thread._is_paused: self.collector_thread.resume() self.pause_btn.setText("暂停采集") self.log_message("继续数据采集...") else: self.collector_thread.pause() self.pause_btn.setText("继续采集") self.log_message("数据采集已暂停...") def stop_test(self): """停止采集""" self.log_message("停止数据采集...") # 停止线程 if self.collector_thread.isRunning(): self.collector_thread.stop() if self.processor_thread.isRunning(): self.processor_thread.stop() # 保存本次测试数据 test_name = f"测试{self.test_counter}" test_data = self.data_store.get_all_data() self.history_tests[test_name] = test_data # 添加到历史测试列表 item = QListWidgetItem(test_name) item.setData(Qt.UserRole, test_name) # 存储测试名称 self.test_list.addItem(item) self.log_message(f"已保存本次测试数据: {test_name}") self.test_counter += 1 # 更新UI状态 self.start_btn.setEnabled(True) self.pause_btn.setEnabled(False) self.stop_btn.setEnabled(False) self.restart_current_btn.setEnabled(False) self.restart_btn.setEnabled(True) self.export_btn.setEnabled(True) self.pause_btn.setText("暂停采集") # 重置按钮文本 data_count = len(test_data) self.log_message(f"采集完成,共收集 {data_count} 个样本") def show_selected_test(self): """显示选中的测试数据""" selected_items = self.test_list.selectedItems() if not selected_items: return # 只显示第一个选中的测试 test_name = selected_items[0].data(Qt.UserRole) test_data = self.history_tests.get(test_name, []) # 更新原始数据表格 self.data_table.setRowCount(0) for row, data_point in enumerate(test_data): self.data_table.insertRow(row) self.data_table.setItem(row, 0, QTableWidgetItem(data_point["timestamp"])) self.data_table.setItem(row, 1, QTableWidgetItem(str(data_point["sample_id"]))) self.data_table.setItem(row, 2, QTableWidgetItem(f"{data_point['value']:.2f}")) self.data_table.setItem(row, 3, QTableWidgetItem(f"{data_point['temperature']:.2f}")) # 更新处理结果表格(需要重新计算) if test_data: values = [d['value'] for d in test_data] avg_value = sum(values) / len(values) max_value = max(values) min_value = min(values) self.result_table.setRowCount(0) self.result_table.insertRow(0) self.result_table.setItem(0, 0, QTableWidgetItem(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) self.result_table.setItem(0, 1, QTableWidgetItem(str(len(test_data)))) self.result_table.setItem(0, 2, QTableWidgetItem(f"{avg_value:.2f}")) self.result_table.setItem(0, 3, QTableWidgetItem(f"{max_value:.2f}")) self.result_table.setItem(0, 4, QTableWidgetItem(f"{min_value:.2f}")) def export_data(self): """导出选中的测试数据到Excel文件""" selected_items = self.test_list.selectedItems() if not selected_items: QMessageBox.warning(self, "导出失败", "请选择要导出的测试集") return # 收集所有选中的测试数据 all_data = [] for item in selected_items: test_name = item.data(Qt.UserRole) test_data = self.history_tests.get(test_name, []) # 为每个数据点添加测试名称 for data_point in test_data: data_point_with_test = data_point.copy() data_point_with_test["test_name"] = test_name all_data.append(data_point_with_test) if not all_data: QMessageBox.warning(self, "导出失败", "选中的测试集没有可导出的数据") return try: today = datetime.now() filename = f"data_export_{today.strftime('%Y%m%d_%H%M%S')}.xlsx" # 创建DataFrame并导出 df = pd.DataFrame(all_data) # 重新排序列 column_order = ["test_name", "timestamp", "sample_id", "value", "temperature"] df = df[column_order] df.to_excel(filename, index=False) self.log_message(f"已导出 {len(selected_items)} 个测试集的数据到: {filename}") QMessageBox.information(self, "导出成功", f"已成功导出 {len(selected_items)} 个测试集的数据到:\n{filename}") except Exception as e: self.log_message(f"导出失败: {str(e)}") QMessageBox.critical(self, "导出错误", f"导出数据时发生错误:\n{str(e)}") def add_data_row(self, data): """添加数据到表格""" row = self.data_table.rowCount() self.data_table.insertRow(row) self.data_table.setItem(row, 0, QTableWidgetItem(data["timestamp"])) self.data_table.setItem(row, 1, QTableWidgetItem(str(data["sample_id"]))) self.data_table.setItem(row, 2, QTableWidgetItem(f"{data['value']:.2f}")) self.data_table.setItem(row, 3, QTableWidgetItem(f"{data['temperature']:.2f}")) # 自动滚动到最后一行 self.data_table.scrollToBottom() def add_result_row(self, result): """添加处理结果到表格""" row = self.result_table.rowCount() self.result_table.insertRow(row) self.result_table.setItem(row, 0, QTableWidgetItem(result["timestamp"])) self.result_table.setItem(row, 1, QTableWidgetItem(str(result["samples"]))) self.result_table.setItem(row, 2, QTableWidgetItem(f"{result['avg_value']:.2f}")) self.result_table.setItem(row, 3, QTableWidgetItem(f"{result['max_value']:.2f}")) self.result_table.setItem(row, 4, QTableWidgetItem(f"{result['min_value']:.2f}")) # 自动滚动到最后一行 self.result_table.scrollToBottom() def update_progress(self, count): """更新进度条""" self.progress_bar.setValue(count % 100) def update_status(self, status): """更新状态标签""" self.status_label.setText(status) def log_message(self, message): """添加日志消息""" timestamp = datetime.now().strftime("%H:%M:%S") self.log_view.append(f"[{timestamp}] {message}") def closeEvent(self, event): """窗口关闭时确保线程停止""" if self.collector_thread.isRunning(): self.collector_thread.stop() if self.processor_thread.isRunning(): self.processor_thread.stop() event.accept() if name == “main”: app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) 接下来是需要修改的程序,请根据上面程序的内容,修改下面程序的数据采集后的部分,仿照上面的程序在测试后建立测试集,选中测设集可以导出为excel文件。不要修改原界面布局,界面中间部分的下方空白处放的是采集的数据,右上方的空白处显示数据集,将“导出全部为json”改为“导出为Excel”,点击此按钮即可导出excel文件,其他的部分仍要保持原样 import sys from PyQt5.QtGui import QPixmap, QPainter from PyQt5.QtWidgets import ( QApplication, QMainWindow, QDockWidget, QVBoxLayout, QWidget, QLabel, QPushButton, QTreeWidget, QTreeWidgetItem, QTextEdit, QFileDialog, QMessageBox, QTextBrowser ) from PyQt5.QtCore import Qt, QTimer, QUrl, QThread, QDir from ui.Pages.capturePage.LeftRegion1 import StatusRegion from ui.Pages.capturePage.RightRegion import videoRegion, videoRegion1 from ui.Pages.capturePage.CenterUpRegion import CentralUpRegion from ui.Pages.capturePage.CenterDownRegion1 import CentralDownpRegion class CapturePage(QMainWindow): def init(self): super().init() self.init_ratio() self.initUI() self.slot_connect() def init_ratio(self): """初始化区域比例""" self.horizontal_ratio = [0.2, 0.8] # 左右区域 self.vertical_ratio = [0.5, 0.5] # 中部上下 self.right_ratio = [0.5, 0.5] # 右侧上下 def slot_connect(self): """连接信号槽""" self.status_ui.device_status_changed.connect(self.central_down_widget.get_device_status) self.status_ui.device_stream.connect(self.central_down_widget.handle_data_from_device) def initUI(self): self.takeCentralWidget() self.setDockOptions(self.dockOptions() | QMainWindow.DockOption.AllowTabbedDocks) self.setDockNestingEnabled(True) self.setWindowTitle("数据采集界面") self.setGeometry(100, 100, 1600, 1000) # 初始窗口大小 # 左侧区域 self.status_ui = StatusRegion() self.addDockWidget(Qt.LeftDockWidgetArea, self.status_ui) # 中间区域 self.central_up_widget = CentralUpRegion() # 右侧区域 self.video1_ui = videoRegion() self.central_down_widget = CentralDownpRegion(self.central_up_widget, self.video1_ui) self.video2_ui = videoRegion1() self.addDockWidget(Qt.RightDockWidgetArea, self.video1_ui) self.addDockWidget(Qt.RightDockWidgetArea, self.video2_ui) # 嵌套布局 self.splitDockWidget(self.status_ui, self.central_up_widget, Qt.Horizontal) self.splitDockWidget(self.central_up_widget, self.central_down_widget, Qt.Vertical) self.splitDockWidget(self.video1_ui, self.video2_ui, Qt.Vertical) # 背景图 self.background = QPixmap(r"C:\Users\86153\Downloads\【慧首UI】开发\素材\caiji.jpg") def paintEvent(self, event): painter = QPainter(self) painter.drawPixmap(self.rect(), self.background) def resizeEvent(self, event): """保持窗口缩放时区域比例不变""" super().resizeEvent(event) # 横向分配(左:状态,中:中心区域) total_width = self.width() left_width = int(total_width * self.horizontal_ratio[0]) center_width = int(total_width * self.horizontal_ratio[1]) self.resizeDocks([self.status_ui, self.central_up_widget], [left_width, center_width], Qt.Horizontal) # 中部纵向分配(上、下) center_total_height = self.central_up_widget.height() + self.central_down_widget.height() up_height = int(center_total_height * self.vertical_ratio[0]) down_height = int(center_total_height * self.vertical_ratio[1]) self.resizeDocks([self.central_up_widget, self.central_down_widget], [up_height, down_height], Qt.Vertical) # 右侧纵向分配(video1, video2) right_total_height = self.video1_ui.height() + self.video2_ui.height() video1_height = int(right_total_height * self.right_ratio[0]) video2_height = int(right_total_height * self.right_ratio[1]) self.resizeDocks([self.video1_ui, self.video2_ui], [video1_height, video2_height], Qt.Vertical) if name == ‘main’: app = QApplication(sys.argv) main_window = CapturePage() main_window.show() sys.exit(app.exec_()) 以下为程序中调用的程序 import sys from PyQt5.QtWidgets import QVBoxLayout, QWidget, QLabel, QHBoxLayout, QPushButton, QTextBrowser from PyQt5.QtCore import Qt from PyQt5.QtWidgets import * from CenterUpRegion import CentralUpRegion from tools.device.myoDevice1 import DataCollectorThread from VideoPlay1 import VideoPlayerThread from ui.Pages.capturePage.tools.VideoPlay import VideoPlayerThread class CentralDownpRegion(QDockWidget): def init(self, PlayRegion,parent=None): super().init(‘采集控制区域’) self.root_path = r’C:\Users\86153\Downloads\【慧首UI】开发\素材’# 视频文件目录 self.video_paths = [‘休息.mp4’,‘握拳.mp4’, ‘抓手机.mp4’, ‘捏杯盖.mp4’, ‘抓水杯.mp4’, ‘二指捏笔.mp4’, ‘伸食指.mp4’, ‘捏钥匙.mp4’] self.PlayRegion = PlayRegion # 视频播放(对应上边的那个类) self.initUI() self.mode = 0 # 采集模式(0=全部采集,1=单个动作) self.current_action = 0 # 当前动作索引 (0~6) self.current_repeat = 0 # 当前动作的采集次数 (0~5) self.target_action = 0 # 目标动作(单个采集模式下) self.target_repeats = 6 # 目标采集次数(默认6次) self.is_paused = False # 是否暂停 self.is_resting = False # 是否处于休息状态 def initUI(self): # 创建中心区域布局 self.lower_area_widget = QWidget() self.lower_area_layout = QVBoxLayout() self.collect_button_layout = QHBoxLayout() # 选择模式 self.mode_all = QRadioButton("全部采集") self.mode_single = QRadioButton("单个动作采集") self.mode_all.setChecked(True) self.collect_button_layout.addWidget(self.mode_all) self.collect_button_layout.addWidget(self.mode_single) # 选择动作(单个模式) self.action_label = QLabel("选择动作:") self.action_select = QSpinBox() self.action_select.setRange(1, 7) # 1~7 对应索引 0~6 self.collect_button_layout.addWidget(self.action_label) self.collect_button_layout.addWidget(self.action_select) # 选择采集次数(单个模式) self.repeat_label = QLabel("采集次数:") self.repeat_select = QSpinBox() self.repeat_select.setRange(1, 6) # 1~6 次 self.collect_button_layout.addWidget(self.repeat_label) self.collect_button_layout.addWidget(self.repeat_select) self.lower_area_layout.addLayout(self.collect_button_layout) # 采集控制按钮 self.control_button_layout = QHBoxLayout() self.start_button = QPushButton("开始采集") self.pause_button = QPushButton("暂停采集") self.resume_button = QPushButton("继续采集") self.restart_current_button = QPushButton("重新本次采集") self.restart_button = QPushButton("重新采集") self.control_button_layout.addWidget(self.start_button) self.control_button_layout.addWidget(self.pause_button) self.control_button_layout.addWidget(self.resume_button) self.control_button_layout.addWidget(self.restart_current_button) self.control_button_layout.addWidget(self.restart_button) self.lower_area_layout.addLayout(self.control_button_layout) # 采集状态显示 self.collect_status = QTextBrowser() self.lower_area_layout.addWidget(self.collect_status) self.lower_area_widget.setLayout(self.lower_area_layout) self.setWidget(self.lower_area_widget) # 绑定按钮事件 self.start_button.clicked.connect(self.start_collection) self.pause_button.clicked.connect(self.pause_collection) self.resume_button.clicked.connect(self.resume_collection) self.restart_current_button.clicked.connect(self.restart_current_collection) self.restart_button.clicked.connect(self.restart_collection) # 模式切换 self.mode_all.toggled.connect(self.update_mode) self.mode_single.toggled.connect(self.update_mode) # 禁用“继续采集”按钮,只有在暂停后才能点击 self.resume_button.setEnabled(False) def update_mode(self): """ 更新模式选择 """ if self.mode_all.isChecked(): self.mode = 0 self.action_select.setEnabled(False) self.repeat_select.setEnabled(False) else: self.mode = 1 self.action_select.setEnabled(True) self.repeat_select.setEnabled(True) def start_collection(self): self.current_action = self.action_select.value() - 1 self.start_button.setEnabled(False) self.pause_button.setEnabled(True) self.resume_button.setEnabled(False) self.restart_current_button.setEnabled(True) self.restart_button.setEnabled(True) self.thread = VideoPlayerThread(self.root_path,self.video_paths) # 创建线程 self.thread.frame_ready.connect(self.PlayRegion.update_frame) self.thread.start_playback(self.mode,self.current_action,1) def pause_collection(self): self.collect_status.append("采集暂停...") self.start_button.setEnabled(False) self.pause_button.setEnabled(False) self.resume_button.setEnabled(True) self.restart_current_button.setEnabled(True) self.restart_button.setEnabled(True) self.thread.pause() def resume_collection(self): self.collect_status.append(f"恢复采集,继续动作 {self.current_action + 1},第 {self.current_repeat} 次采集...") self.start_button.setEnabled(False) self.pause_button.setEnabled(True) self.resume_button.setEnabled(False) self.restart_current_button.setEnabled(True) self.restart_button.setEnabled(True) self.thread.resume() def restart_current_collection(self): self.collect_status.append(f"重新开始当前动作 {self.current_action + 1}...") self.start_button.setEnabled(True) self.pause_button.setEnabled(False) self.resume_button.setEnabled(False) self.restart_current_button.setEnabled(True) self.restart_button.setEnabled(True) self.thread.stop() def restart_collection(self): self.collect_status.append("重新开始所有采集...") self.start_button.setEnabled(True) self.pause_button.setEnabled(False) self.resume_button.setEnabled(False) self.restart_current_button.setEnabled(True) self.restart_button.setEnabled(True) self.thread.stop() class MainWindow(QMainWindow): def init(self): super().init() self.setWindowTitle(“视频采集系统”) self.PlayRegion = CentralUpRegion(self) self.collect_control = CentralDownpRegion(self.PlayRegion) self.addDockWidget(Qt.TopDockWidgetArea, self.PlayRegion) self.addDockWidget(Qt.BottomDockWidgetArea, self.collect_control) if name == ‘main’: app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec_()) 以及 from PyQt5.QtCore import Qt from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import QLabel, QWidget, QVBoxLayout, QDockWidget class CentralUpRegion(QDockWidget): def init(self, parent=None): super().init(‘视频播放区域’, parent) # self.root_path = ‘D:/Code/UI/【慧首UI】开发/素材’ # 视频文件目录 # self.video_paths = [‘休息.mp4’,‘握拳.mp4’, ‘抓手机.mp4’, ‘捏杯盖.mp4’, ‘抓水杯.mp4’, ‘二指捏笔.mp4’, ‘伸食指.mp4’, # ‘捏钥匙.mp4’] self.current_video_index = 0 self.play_count = 0 self.play_limit = None self.mode = 0 self.action_index = None self.cap = None self.video_label = QLabel() self.initUI() # self.videoPlayThread.frame_ready.connect(self.update_frame) def initUI(self): # self.video_label = QLabel() self.video_label.setAlignment(Qt.AlignCenter) self.video_label.setText("等待播放视频...") self.widget = QWidget() self.layout = QVBoxLayout() self.layout.addWidget(self.video_label) self.widget.setLayout(self.layout) self.setWidget(self.widget) def update_frame(self,qimg): # print("接收到视频帧") self.video_label.setPixmap(QPixmap.fromImage(qimg))
06-27
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值