记PyQt5写测试工具,EXE运行期间报错闪退问题解决过程


问题:

        pycharm上运行程序进行测试时功能正常,没有出现闪退的情况。

        但是用pyinstaller打包成EXE程序运行时,执行测试会闪退。

问题发现过程:

        用pycharm调试未发现任何问题,一样的代码选择一样的文件,pycharm运行就是没报错。

查资料得知用pyinstaller打包时增加参数 -c 可以在程序运行时看到报错

最后通过报错发现是文件路径的问题,在代码中加载EXCEL文件的代码传递的路径只有文件名称而不带文件路径,因为选择的文件与.py文件存在同一目录下,所以pycharm运行正常。而打包的exe运行时就会找不到文件。

问题解决:

加载文件时传递获取到的完成文件路径

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 PyQt5 的 qthreadpool 进行多线程编程时,如果需要调用主线程的函数,需要使用 PyQt5 的信号与槽机制来实现。直接在子线程中调用主线程函数会导致线程不安全,从而导致程序崩溃或者出现未知错误。 下面是一个使用信号与槽机制调用主线程函数的简单示例: ```python from PyQt5.QtCore import QObject, pyqtSignal, QThreadPool, QRunnable class WorkerSignals(QObject): finished = pyqtSignal() result = pyqtSignal(object) class Worker(QRunnable): def __init__(self, func, *args, **kwargs): super(Worker, self).__init__() self.func = func self.args = args self.kwargs = kwargs self.signals = WorkerSignals() def run(self): result = self.func(*self.args, **self.kwargs) self.signals.result.emit(result) self.signals.finished.emit() class MainWindow(QWidget): def __init__(self): super().__init__() self.threadpool = QThreadPool() self.initUI() def initUI(self): self.setWindowTitle('MainWindow') self.setGeometry(100, 100, 300, 200) button = QPushButton('Start', self) button.clicked.connect(self.start_work) button.move(100, 100) self.show() def start_work(self): worker = Worker(self.do_work) worker.signals.result.connect(self.on_result) self.threadpool.start(worker) def do_work(self): # 子线程的工作 return 'result' def on_result(self, result): # 主线程的函数 print(result) ``` 在这个例子中,我们创建了一个 Worker 类来执行子线程的工作,当子线程工作完时,通过信号 result 将结果发送到主线程的 on_result 函数中进行处理。在 start_work 函数中,我们通过 threadpool 来启动子线程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值