单击启动进程



我试图添加多处理到我的项目。举个例子,我做了一个只有一个按钮的小项目,当按钮被按下时,我想用一个方法启动一个过程,但这个方法从未被调用过。如何在进程中调用该方法?

下面是我的代码:
from multiprocessing import Process
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys

class Window(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Python ")
self.setGeometry(100, 100, 600, 400)
self.UiComponents()
self.show()
def UiComponents(self):
button = QPushButton("CLICK", self)
button.setGeometry(200, 150, 100, 30)
proc = Process(target=self.button_clicked)
procs = []
procs.append(proc)
button.clicked.connect(proc.start)
def button_clicked(self):
print("pressed")

App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())

通常将Qt GUI对象和任何允许线程/多处理的对象混合在一起是不安全的,并且要么不起作用,要么导致分段错误。

要做到这一点而不使应用程序崩溃的正确方法是将目标函数移动为与QT GUI无关的函数。(不是任何Qt GUI对象的成员,也没有对任何Qt GUI对象的引用)

进程也只能启动一次,所以你需要在每次按下按钮时创建一个,如下所示:

from multiprocessing import Process
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
def some_function():
print("hello")
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Python ")
self.setGeometry(100, 100, 600, 400)
self.UiComponents()
self.show()
def UiComponents(self):
button = QPushButton("CLICK", self)
button.setGeometry(200, 150, 100, 30)
self.procs = []
button.clicked.connect(self.button_clicked)
def button_clicked(self):
proc = Process(target=some_function)
self.procs.append(proc)
proc.start()


if __name__ == "__main__":  # for windows compatibility
App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())

按钮连接到一个属于Qt对象的函数,但是进程连接到一个没有以任何方式连接到Qt的函数,因此不会使你的应用程序崩溃。

相关内容

  • 没有找到相关文章

最新更新