当前位置: 首页 > article >正文

PyQt6开发可视化界面中遇到问题及解决方案集合

PyQt6开发可视化界面中遇到问题及解决方案集合安装与配置1.配环境の拷打因为博主这个项目本来是在pycharm中的本地python3.12.7环境下开发的涉及mineru解析vectordatabase、fuseki、neo4j入库等核心模块开发桌面软件时遇到了许多环境配置问题原来是打算用pyside6但是安装好后运行时一直找不到路径Traceback (most recent call last): File D:\传输\电网知识智能系统\RAG_LLM_Learn\QT_py\worker_thread.py, line 3, in module from PySide6.QtWidgets import (QApplication, QMainWindow, QPushButton, QLineEdit, QLabel, ImportError: DLL load failed while importing QtWidgets: 找不到指定的程序。 这个报错咋回事上面问ai显示PySide6安装不完整、版本不兼容或者系统缺少依赖库导致的于是我转念一想既然对pyqt6更熟悉那就换pyqt6吧换pyqt6后还是报错Traceback (most recent call last): File D:\传输\电网知识智能系统\RAG_LLM_Learn\QT_py\worker_thread.py, line 5, in module from PyQt6.QtCore import QThread, Signal ModuleNotFoundError: No module named PyQt6.QtCore 还是报错还是显示安装不完整python有问题注意pycharm中运行按钮很可能和pycharm终端的python解释器不同这就会导致按钮可以成功运行但在终端用命令行运行时就会报错对此不要尝试去让两个环境pycharm中的终端和按钮去对齐这太困难了直接新建anaconda环境并将用得最多的那个python环境通过requirement.txt导入anaconda环境中2.换上anaconda -----柳暗花明为了保护原来环境不冲突也为了方便自动使用合适版本我选择将原来pycharm环境导入新建的anaconda环境anaconda_pyqt当中在anaconda中新建环境并导入依赖后相在pycharm中开发也遇到了问题pycharm切换环境时一直卡着推测可能因为anaconda_pyqt中依赖过多导致程序卡死对此我选择直接在pycharm终端里打开anaconda环境pycharm的终端可能找不到conda环境 PS D:\传输\电网知识智能系统\RAG_LLM_Learn conda listconda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写如果包括路径请确保路径正确然后再试一次。所在位置 行:1 字符: 1conda list CategoryInfo : ObjectNotFound: (conda:String) [], CommandNotFoundException FullyQualifiedErrorId : CommandNotFoundException 对此需要做到 1. 先在pycharm终端找到anaconda的精确位置 where conda 2. pycharm终端里运行 D:\ProgramData\anaconda3\shell\condabin\conda-hook.ps1 3. 验证conda list之后再遇到缺包的问题直接将报错发给ai按需下载就行了conda环境会自动选择不冲突的包最终环境配置完美结局pyqt软件开发时遇到的问题已经实现的核心功能模块如何封装如何在软件主程序 main.py中调用软件ui界面日志更新在包含许多功能模块的软件中每个模块都需要实时更新ui日志怎么做才能做到这个呢会不会出现线程冲突呢原方案1在main.py中定义了日志的# 日志信号类用于线程安全发日志 class LogSignal(QObject): log_signal pyqtSignal(str)在初始化函数中self.log_signal LogSignal() # 日志信号 self.log_signal.log_signal.connect(self._add_log) # 绑定日志槽函数定义入库槽函数def _start_upload_to_vector(self):“”“点击一键入库后执行”“”file_path self.selected_file.strip()校验文件if not file_path:self.log_signal.log_signal.emit(“❌ 请先选择文件”)returnif not file_path.endswith(“.json”):self.log_signal.log_signal.emit(“❌ 仅支持 .json 文件入库向量数据库”)returnself.log_signal.log_signal.emit(f 开始入库{file_path})self.select_Todatabase_btn2.setEnabled(False) # 防止重复点击创建工作线程def task():return upload_to_vector(file_path)线程结束回调def callback(result: bool):self.select_Todatabase_btn2.setEnabled(True)if result:self.log_signal.log_signal.emit(“✅ 向量数据库入库完成”)else:self.log_signal.log_signal.emit(“❌ 向量数据库入库失败”)启动线程thread WorkThread(task, callback)thread.start()然后再修改 vector_database.py 让它支持实时发日志 在封装函数内部定义# 内部日志工具def log(msg):print(msg)if log_callback:log_callback(msg)回到 main.py 让线程支持日志传递修改 _start_upload_to_vector 里的 task 函数def task():把界面的 log 方法传递给 upload_to_vectorreturn upload_to_vector(file_path,log_callbacklambda msg: self.log_signal.log_signal.emit(msg))结果无法做到实时更新这个方案扑街~解决方案ai给的方案还是不错的学到了学到了第一步新建文件 在项目里新建 logger.py 内容只有这几行# logger.pyfrom PyQt6.QtCoreimportQObject, pyqtSignal class GlobalLogger(QObject): log_signalpyqtSignal(str)# 全局单例全项目通用global_loggerGlobalLogger()第二步修改 main.py1. 导入 logger from loggerimportglobal_logger2. 在 init 里绑定信号 def __init__(self): super().__init__()...# 绑定全局日志global_logger.log_signal.connect(self._add_log)3. 按钮函数里发日志用 global_logger.log_signal.emit(日志内容)完整 _start_upload_to_vector def _start_upload_to_vector(self): file_pathself.selected_file.strip()ifnot file_path: global_logger.log_signal.emit(❌ 请先选择文件)returnifnot file_path.endswith(.json): global_logger.log_signal.emit(❌ 仅支持 .json 文件入库向量数据库)returnself.select_Todatabase_btn2.setEnabled(False)global_logger.log_signal.emit(f 开始向量数据库入库{file_path})def task():returnupload_to_vector(file_path)def callback(result: bool): self.select_Todatabase_btn2.setEnabled(True)ifresult: global_logger.log_signal.emit(✅ 入库完成)else: global_logger.log_signal.emit(❌ 入库失败)self.upload_threadWorkThread(task, callback)self.upload_thread.start()第三步修改 vector_database.py 顶部导入 from loggerimportglobal_logger 然后日志函数改成 def log(msg): print(msg)global_logger.log_signal.emit(msg)如何确保ui界面不卡 --------新建worker_thread.py文件该文件是专门用来在后台跑耗时任务的 “工人线程”不让界面卡住同时保证日志 / 信号能安全发给主界面。upload_to_vector向量库入库解析 PDF插入数据库全都是耗时操作如果直接在主界面跑 → 界面直接卡死、无响应所以必须用 WorkThread 放到后台跑。导入 PyQt6 的线程基类 信号机制 from PyQt6.QtCoreimportQThread, pyqtSignal1. 定义线程类 class WorkThread(QThread): 这是一个自定义线程类 继承自 QThread → 拥有 Qt 官方线程能力 作用在后台执行任务不影响主界面2. 定义信号用来和主界面通信 进度信号发 进度值 日志消息 progress_updatedpyqtSignal(int, str)完成信号发 是否成功 消息 finishedpyqtSignal(bool, str)信号是什么 就是 “线程给主界面发消息的通道” 子线程不能直接改界面 只能发信号 主界面接收信号 → 安全更新日志、进度条 你现在的实时日志就是靠信号实现的3. 构造函数接收要执行的任务 def __init__(self, task_func,callback_funcNone): super().__init__()self.task_functask_func# 后台执行的任务self.callback_funccallback_func# 任务完成后要执行的函数这里接收两个东西 task_func 你要后台跑的函数比如 upload_to_vector(file_path)callback_func可选 任务跑完后主线程要做的事 恢复按钮 打印完成日志4. run()—— 线程真正执行的地方核心 def run(self): try:# 1. 执行耗时任务在后台resultself.task_func()# 2. 任务完成 → 调用回调函数ifself.callback_func: self.callback_func(result)# 3. 发信号告诉主线程成功了self.finished.emit(True,执行完成)except Exception as e:# 出错了 → 打印错误 发失败信号print(f线程异常{str(e)})self.finished.emit(False, str(e))这里是关键 run()方法一运行就进入子线程 所有耗时操作都在这里执行 主界面完全不会卡住如何优雅搞定多功能模块日志更新 ---------新建日志文件logger.py创建日志类 并定义log成员函数这样就可以很优雅的修改日志格式同时每个功能函数都能使用这个日志对象的函数全局日志文件 from PyQt6.QtCoreimportQObject, pyqtSignal from datetimeimportdatetime class GlobalLogger(QObject): log_signalpyqtSignal(str)# 新增自动带时间的日志方法def log(self, msg): current_timedatetime.now().strftime([%Y-%m-%d %H:%M:%S])log_with_timef{current_time} {msg}self.log_signal.emit(log_with_time)全局单例全项目通用 global_loggerGlobalLogger()创建局部线程变量导致的程序崩溃(anaconda_qt) PS D:\传输\电网知识智能系统\RAG_LLM_Learn\QT_py python .\main.pyPython搜索路径 [‘D:\传输\电网知识智能系统\RAG_LLM_Learn\QT_py’,‘D:\传输\电网知识智能系统\RAG_LLM_Learn\QT_py’,‘D:\传输\电网知识智能系统\RAG_LLM_Learn’,‘D:\ProgramData\anaconda3\envs\anaconda_qt\python312.zip’,‘D:\ProgramData\anaconda3\envs\anaconda_qt\DLLs’,‘D:\ProgramData\anaconda3\envs\anaconda_qt\Lib’,‘D:\ProgramData\anaconda3\envs\anaconda_qt’,‘D:\ProgramData\anaconda3\envs\anaconda_qt\Lib\site-packages’,‘D:\传输\电网 知识智能系统\RAG_LLM_Learn’] QThread: Destroyed while thread isstill running (anaconda_qt) PS D:\传输\电网知识智能系统\RAG_LLM_Ldef _start_llm_extract(self):# 1. 选择 MD 文件夹md_folder QFileDialog.getExistingDirectory(self, “选择存放 md 文件的文件夹”)if not md_folder:global_logger.log(“❌ 未选择文件夹”)return# 2. 查找所有 MD 文件 md_files glob.glob(os.path.join(md_folder, *.md)) if len(md_files) 0: global_logger.log(❌ 文件夹内没有 .md 文件) return total_files len(md_files) global_logger.log(f✅ 找到 {total_files} 个 MD 文件开始批量处理) # 3. 弹出参数窗口 dialog LLMSettingWindow(self) if dialog.exec() ! QDialog.DialogCode.Accepted: return params dialog.get_params() # 4. 禁用按钮 self.llm_btn.setEnabled(False) global_logger.log(f 开始批量生成模型{params[model]}最大并发3) # 用成员变量列表保存所有线程防止被销毁 self.llm_threads [] # 用成员变量保存线程 self.active_threads 0 self.thread_mutex QMutex() self.finished_count 0 self.max_concurrent 3 self.md_files md_files.copy() self.total_files total_files self.params params # 处理下一个文件 def process_next(): if not self.md_files: return self.thread_mutex.lock() if self.active_threads self.max_concurrent: self.thread_mutex.unlock() return self.active_threads 1 self.thread_mutex.unlock() # 取文件 md_path self.md_files.pop(0) def task(): return extract_all( md_pathmd_path, model_nameself.params[model], p1self.params[prompt_json], p2self.params[prompt_cypher], p3self.params[prompt_ttl] ) def callback(res): self.thread_mutex.lock() self.active_threads - 1 self.finished_count 1 self.thread_mutex.unlock() if res: global_logger.log(f✅ 完成{os.path.basename(md_path)}) else: global_logger.log(f❌ 失败{os.path.basename(md_path)}) # 全部完成 if self.finished_count self.total_files: global_logger.log( 全部 MD 文件处理完成) self.llm_btn.setEnabled(True) process_next() # 线程存入成员变量列表 thread WorkThread(task, callback) self.llm_threads.append(thread) # 不会被销毁 thread.start() # 启动 for _ in range(self.max_concurrent): process_next()在 _start_llm_extract 内部的递归函数里创建了局部线程变量thread WorkThread(task, callback)thread.start()原来这个 thread 是函数call_back里的临时变量函数一跑完Python 就把它销毁了但线程还在后台调用大模型 → 对象没了 → Qt 直接报错通过下述方法成功解决用成员变量列表保存所有线程防止被销毁self.llm_threads [] # 用成员变量保存线程用成员变量列表来装着递归函数里创建的线程使线程不会因函数递归结束而被杀

相关文章:

PyQt6开发可视化界面中遇到问题及解决方案集合

PyQt6开发可视化界面中遇到问题及解决方案集合 安装与配置: 1.配环境の拷打 因为博主这个项目本来是在pycharm中的本地python3.12.7环境下开发的,涉及mineru解析,vectordatabase、fuseki、neo4j入库等核心模块,开发桌面软件时遇…...

DeepSeekubernetes-1.35.3/kubernetes-1.35.3/test/utils/ktesting/examples/logging/example_test.go 源码分析

我来分析 Kubernetes 测试工具 ktesting 中的日志示例文件 example_test.go。这个文件展示了如何在 Kubernetes 测试中使用结构化日志。 文件概述 这是 Kubernetes v1.35.3 中 test/utils/ktesting 包的示例文件,展示了如何使用 ktesting 框架进行带有结构化日志的测…...

委托的全面知识总结(C#)

一.定义与本质委托是干什么的?委托就是用来存 方法 的容器你可以把一个方法当成 数据 一样传递1.什么是委托委托是C#中类型安全的函数指针,它是一种“类型”,可以存储,调用,传递一个或多个方法的引用2.核心本质委…...

如何3步轻松备份微博内容:Speechless免费PDF导出完整指南

如何3步轻松备份微博内容:Speechless免费PDF导出完整指南 【免费下载链接】Speechless 把新浪微博的内容,导出成 PDF 文件进行备份的 Chrome Extension。 项目地址: https://gitcode.com/gh_mirrors/sp/Speechless 在信息快速更迭的数字时代&…...

PPTist:重构演示文稿创作流程的3大颠覆性突破

PPTist:重构演示文稿创作流程的3大颠覆性突破 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing for the ed…...

FALCON: Fast Autonomous Aerial ExplorationUsing Coverage Path Guidance(覆盖路径引导的快速自主空中探索)

创新点:提出一种基于连接性的增量式空间分解和连接图构造方法,捕获环境拓扑并促进有效的探测覆盖路径规划提出一种分层的探索规划方法,生成合理的覆盖路径作为全局指导,并优化局部边界访问顺序,保持覆盖路径的意图。提…...

抢答器软件哪家强?五款抢答器软件全方位深度评测

在知识竞赛、企业培训、团队建设等活动中,一套高效、公平、稳定的抢答器软件是活动成功的关键。面对市场上琳琅满目的产品,如何选择成为许多组织者的难题。本文将从实际应用出发,对五款主流的抢答器软件进行深度评测,涵盖功能、性…...

驱动模块的加载与卸载机制

昨天调板子又遇到个怪事:insmod加载驱动一切正常,但rmmod死活卸载不掉,内核日志里只留下一行“Device or resource busy”。查了半小时才发现,原来是有个用户态进程没关,一直占着驱动文件。这种问题在嵌入式开发里太常…...

AI技术原理--AI Token是什么:10分钟搞懂大模型基础单位

当你在ChatGPT里输入"你好,今天天气怎么样"的时候,你以为它真的读懂你的话吗? 并不是。 在你看不到的地方,有一个叫"分词器"的程序,正在把你的文字拆解成一个一个叫"Token"的单元。 …...

【研报280】汽车轻量化材料研究报告:改性塑料的应用趋势

本报告提供限时下载,请查看文后提示以下仅为报告部分内容:摘要:政策与新能源汽车需求双重驱动下,汽车轻量化成为行业核心发展方向,2026年国内将实施新的乘用车碳排放国标,叠加新能源汽车普遍重于燃油车&…...

Delphi经典8大天坑|第五篇:ShortString与String混用,导致字符串截断/乱码

一、现象描述项目中同时使用ShortString和string两种字符串类型,赋值时出现字符串被莫名截断(超过255字符的部分丢失),或出现乱码,尤其是在Delphi D7及以下版本中,问题更常见。典型场景:将一个长…...

强强联合:在快马平台用AI模型驱动你的下一代智能agent应用

最近在尝试用AI辅助开发时,发现了一个特别有意思的方向——智能agent框架。这类框架就像是AI应用的"骨架",而平台内置的AI模型则为其注入了"灵魂"。今天想分享下在InsCode(快马)平台上实现的一个创作辅助agent,整个过程让…...

3步构建数字记忆堡垒:开源工具GetQzonehistory数据留存全攻略

3步构建数字记忆堡垒:开源工具GetQzonehistory数据留存全攻略 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字时代,我们的生活轨迹日益依赖在线平台&#…...

实例 9:液体压强探究

实例 9:液体压强探究 功能介绍: 模拟U形管压强计探究液体内部压强规律。学生将探头放入液体不同深度,观察U形管高度差变化;更换不同密度的液体(水、盐水、酒精),对比压强大小。应用清晰展示“液体压强随深度增加而增大”及“液体压强与液体密度有关”的规律,并可计算具…...

**用Python实现高效分子结构建模与能量计算:从零开始构建你的计算化学工具链**在现代计算化学中,**Python已成

用Python实现高效分子结构建模与能量计算:从零开始构建你的计算化学工具链 在现代计算化学中,Python已成为科研人员首选的编程语言之一,它不仅语法简洁、生态丰富,还具备强大的科学计算能力。本文将带你一步步搭建一个基于Python的…...

双臂机器人piper_ros

1.piper gazebo仿真启动gazebo终端1:cd piper_ros source devel/setup.bash roslaunch piper_gazebo piper_gazebo.launch #有夹爪roslaunch piper_gazebo piper_no_gripper_gazebo.launch #无夹爪启动rviz终端2:cd ~/piper_ros source devel/setup.bash…...

OpenClaw 实用指南-节假日系统巡检全自动化(下)

前言 在上一篇文章中,我们已详细讲解了节假日系统巡检全自动化的前三个核心部分,分别是:Part1:AI节假日智能判断、Part2:目标服务器稳定连接、Part3:借助“小龙虾”工具批量部署软件,并利用部署…...

lvgl_v8之设置label背景颜色一种方式

void lv_label_demo() {static lv_style_t style;lv_style_init(&style);lv_style_set_radius...

Chrome for Testing 终极配置指南:5个实战技巧让浏览器自动化测试更高效

Chrome for Testing 终极配置指南:5个实战技巧让浏览器自动化测试更高效 【免费下载链接】chrome-for-testing 项目地址: https://gitcode.com/gh_mirrors/ch/chrome-for-testing Chrome for Testing 是 GoogleChromeLabs 团队专门为浏览器自动化测试设计的…...

向量数据库:大模型的高效外存

一、 向量数据库概述:AI大模型的“外部记忆体” 向量数据库是一种专门用于存储、索引和查询**向量嵌入(Vector Embedding)**的数据库系统。在大模型时代,它扮演着至关重要的“外部记忆体”角色,其核心价值在于解决大模…...

2024IEEE 《基于二次规划的安全关键型多智能体系统的控制》四旋翼 无人机 MATLAB

2024IEEE 《基于二次规划的安全关键型多智能体系统的控制》四旋翼 无人机 MATLAB 代码复现(文献代码)协同控制 规划 无人机 研究了基于二次规划的安全关键型多智能体系统的控制问题。 每个被控智能体被建模为一个积分器和一个不确定非线性驱动系统的级联…...

基于Comsol的钢筋混凝土腐蚀开裂力学-化学耦合相场模型

基于Comsol的钢筋混凝土腐蚀开裂的力学-化学耦合相场模型 钢筋混凝土腐蚀开裂的力学-化学耦合相场模型,采用多场耦合有限元软件Comsol建模,方便易懂。 相场模型能够准确模拟钢筋混凝土的腐蚀诱导开裂行为。 (附源文件和参考论文)钢…...

BES-XGBoost多变量时间序列预测的‘秃鹰搜索优化算法‘与交叉验证抑制过拟合问题的Mat...

基于秃鹰搜索优化算法优化XGBoost(BES-XGBoost)的多变量时间序列预测 BES-XGBoost多变量时间序列 采用交叉验证抑制过拟合问题 优化参数为迭代次数、最大深度和学习率 matlab代码,注:暂无Matlab版本要求 -- 推荐 2016B 版本及以上 注:采用 XG…...

nlp_gte_sentence-embedding_chinese-large模型在嵌入式Linux系统上的优化部署

nlp_gte_sentence-embedding_chinese-large模型在嵌入式Linux系统上的优化部署 1. 引言 在智能硬件和边缘计算快速发展的今天,越来越多的设备需要在本地运行AI模型。对于嵌入式Linux系统来说,如何在资源受限的环境下高效部署大型文本表示模型&#xff…...

Pixel Aurora Engine应用场景:复古游戏机主题网站AI生成视觉系统集成

Pixel Aurora Engine应用场景:复古游戏机主题网站AI生成视觉系统集成 1. 项目背景与核心价值 Pixel Aurora Engine(像素极光引擎)是一款专为复古游戏风格设计的AI视觉生成系统。它巧妙地将现代AI技术与怀旧像素美学相结合,为网站…...

AI辅助开发:让快马AI理解并生成ccswitch工具的核心逻辑与UI管理代码

AI辅助开发:让快马AI理解并生成ccswitch工具的核心逻辑与UI管理代码 最近在开发一个网络切换工具ccswitch时,发现AI辅助开发能大幅提升效率。通过InsCode(快马)平台集成的AI模型,可以用自然语言描述需求,就能自动生成核心功能代码…...

OpenMS实战指南:如何用开源工具解决质谱数据分析三大难题

OpenMS实战指南:如何用开源工具解决质谱数据分析三大难题 【免费下载链接】OpenMS The codebase of the OpenMS project 项目地址: https://gitcode.com/gh_mirrors/op/OpenMS 你是否正在为复杂的质谱数据分析而烦恼?面对海量的LC-MS数据&#xf…...

FIFA 23 Live Editor终极指南:10分钟掌握实时游戏修改技巧

FIFA 23 Live Editor终极指南:10分钟掌握实时游戏修改技巧 【免费下载链接】FIFA-23-Live-Editor FIFA 23 Live Editor 项目地址: https://gitcode.com/gh_mirrors/fi/FIFA-23-Live-Editor FIFA 23 Live Editor 是一款专为FIFA 23玩家设计的革命性实时编辑工…...

操作系统与数据库系统的核心知识点,属于计算机科学与技术专业(尤其是考研408统考或相关课程)的重点复习提纲

操作系统与数据库系统的核心知识点,属于计算机科学与技术专业(尤其是考研408统考或相关课程)的重点复习提纲。以下是对各部分的简明梳理与关键点说明: ✅ 死锁处理 预防:破坏死锁四个必要条件之一(互斥、占…...

Redis Sentinel 高可用方案在WMS仓储管理系统的应用

Redis Sentinel 高可用方案在WMS仓储管理系统的应用 一、仓储场景的特殊挑战 在WMS(Warehouse Management System)系统中,Redis承载着高频且关键的业务数据:业务模块Redis用途可用性要求库存实时缓存SKU库存量、库位占用状态99.99…...