拾玖呀 2024-12-18 11:43 采纳率: 0%
浏览 143
已结题

pyqt5打包后执行出现重复打开窗口

#使用pyqt5重复打开主界面窗口
使用pyqt5调用子进程执行py脚本时,在pycharm中执行正常,但是打包为exe执行时,会出现重复打开主界面窗口的问题

_注意_
解决方案需要满足的要求
1、必须使用subprocess.Popen
2、尽量不要修改StreamReader

示例代码如下:

#主界面函数gui_print_log.py

# -*- coding: utf-8 -*-
# @Time    : 2024/12/18 9:24
# @Author  : jinjie
# @File    : gui_print_log.py


import sys
from PyQt5.QtWidgets import QApplication, QTextEdit, QVBoxLayout, QPushButton, QWidget
from PyQt5.QtCore import QThread, pyqtSignal
import subprocess

class StreamReader(QThread):
    append_text = pyqtSignal(str)

    def __init__(self, process):
        super().__init__()
        self.process = process
        self._is_running = True

    def run(self):
        while self._is_running:
            output = self.process.stdout.readline()
            if output == '' and self.process.poll() is not None:
                self._is_running = False
                break
            if output:
                self.append_text.emit(output.strip())

    def stop(self):
        self._is_running = False

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

    def initUI(self):
        self.setGeometry(100, 100, 800, 600)
        self.setWindowTitle('日志窗口')

        self.layout = QVBoxLayout()
        self.log_widget = QTextEdit()
        self.layout.addWidget(self.log_widget)

        self.start_button = QPushButton('开始任务')
        self.start_button.clicked.connect(self.start_process)
        self.layout.addWidget(self.start_button)

        self.setLayout(self.layout)

    def append_log(self, message):
        self.log_widget.append(message)

    # path = "F:\PyCharm_project\generate_testbench_local\jyj_suanfa_release_V1_4_4\FPGA_project_1"
    # enable_gui = "y"
    # vunit_args = "-p 2"
    def start_process(self):

        process = subprocess.Popen(
            [sys.executable, 'subprocess_script.py'],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
            encoding="utf-8"
        )

        self.stream_reader = StreamReader(process)
        self.stream_reader.append_text.connect(self.append_log)
        self.stream_reader.start()


    def stop_process(self):
        pass
    
    

if __name__ == "__main__":
    app = QApplication(sys.argv)
    log_window = LogWindow()
    log_window.show()
    sys.exit(app.exec_())



```python

# -*- coding: utf-8 -*-
# @Time    : 2024/12/18 9:36
# @Author  : jinjie
# @File    : subprocess_script.py


import time

def main():
    for i in range(10):
        print(f'日志消息 {i + 1}')
        time.sleep(1)

if __name__ == "__main__":
    main()

在pycharm中运行gui_print_log.py打开界面正常,如图:

img

打包指令

pyinstaller -D -w  .\gui_print_log.py

打包为exe后执行会出现多个窗口

img

  • 写回答

33条回答 默认 最新

  • 阿里嘎多学长 2024-12-18 11:43
    关注
    获得0.40元问题酬金

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    pyqt5打包后执行出现重复打开窗口

    你遇到的问题是,使用 PyQt5 打包后的可执行文件,在执行时会出现重复打开主界面窗口的问题。这个问题可能是由于 PyQt5 在 Windows 平台下使用的进程模型导致的。

    在 PyQt5 中,GUI 应用程序默认使用单个进程模型,这意味着每次你点击按钮或执行某个操作时,PyQt5 都会创建一个新的进程来执行对应的操作。这样,在你打包后的可执行文件中,每次你点击按钮或执行某个操作时,PyQt5 都会创建一个新的进程来执行对应的操作,这样就会导致重复打开主界面窗口的问题。

    解决这个问题的一种方法是使用 QApplication.processEvents() 方法来处理 GUI 事件。这个方法可以让 PyQt5 在执行某个操作时,暂停当前进程,直到操作完成后再继续执行。

    你可以在你的代码中添加以下代码来解决这个问题:

    import sys
    from PyQt5.QtWidgets import QApplication
    
    # 创建 QApplication 对象
    app = QApplication(sys.argv)
    
    # 在这里添加你的 GUI 代码
    
    # 使用 QApplication.processEvents() 方法来处理 GUI 事件
    app.processEvents()
    
    # 在这里添加你的 GUI 代码
    

    这个方法可以让 PyQt5 在执行某个操作时,暂停当前进程,直到操作完成后再继续执行,从而避免重复打开主界面窗口的问题。

    另外,你也可以使用 QProcess 类来执行子进程,而不是使用 QApplication 对象来执行子进程。这样可以避免重复打开主界面窗口的问题。

    总之,解决这个问题的关键是找到导致重复打开主界面窗口的问题的原因,然后使用相应的方法来解决这个问题。

    评论

报告相同问题?

问题事件

  • 系统已结题 12月26日
  • 修改了问题 12月18日
  • 创建了问题 12月18日