You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击按钮启动进程失败:如何在进程中调用目标方法?

问题分析与修复方案

你的代码里有两个核心问题导致按钮点击后目标方法没执行:

  1. Windows多进程启动的脚本重复执行问题:在Windows系统中,multiprocessing用spawn方式创建子进程时会重新导入整个脚本。如果没有if __name__ == '__main__'的保护,子进程会重复创建QApplication和窗口,导致逻辑混乱,目标方法根本跑不起来。
  2. Process实例无法重复启动:你把同一个Process的start方法绑到了点击信号上,但一个Process对象只能启动一次,哪怕多次点击也不会再触发新进程。

修复后的完整代码

from multiprocessing import Process
from PyQt5.QtWidgets import *
import sys

# 把目标方法改成独立函数,避免跨进程访问Qt实例
def button_clicked():
    print("pressed")

class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Python Multiprocessing Test")
        self.setGeometry(100, 100, 600, 400)
        self.UiComponents()
        self.show()

    def UiComponents(self):
        button = QPushButton("CLICK", self)
        button.setGeometry(200, 150, 100, 30)
        # 每次点击都创建新的进程并启动
        button.clicked.connect(self.start_new_process)

    def start_new_process(self):
        proc = Process(target=button_clicked)
        proc.start()

# 必须加这个判断,防止子进程重复执行应用初始化代码
if __name__ == '__main__':
    App = QApplication(sys.argv)
    window = Window()
    sys.exit(App.exec())

关键修改说明

  • 添加if __name__ == '__main__'保护:这是Windows下使用multiprocessing的必要操作,确保只有主进程才会初始化Qt应用和窗口,子进程启动时不会重复执行这部分代码。
  • 目标方法改为独立函数:Qt的窗口实例不能安全地在多进程间共享,把方法抽成独立函数可以避免跨进程访问实例带来的问题,同时子进程能正确找到要执行的函数。
  • 每次点击创建新Process:保证每次点击按钮都会启动一个全新的子进程执行目标方法,不会因为旧Process已经启动过而失效。

如果你的实际需求里,目标方法需要用到窗口中的数据,别直接传Qt对象,用multiprocessing提供的Queue或Pipe来做进程间通信传递数据,这样才安全。

内容的提问来源于stack exchange,提问作者bags

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:50:34