有我的GUI类PyQt5的QtThread引用成员



所以我试图多线程一个按钮点击我的GUI和我的问题是函数需要参考的东西在我的主类,这似乎是不可能的…我看到的每个例子都是这样的:

class Window(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.clicksCount = 0
self.setupUi()
def setupUi(self):
# Create and connect widgets
self.countBtn = QPushButton("Click me!", self)
self.countBtn.clicked.connect(self.countClicks)
def countClicks(self):
self.clicksCount += 1
self.clicksLabel.setText(f"Counting: {self.clicksCount} clicks")
def reportProgress(self, n):
self.stepLabel.setText(f"Long-Running Step: {n}")
def runLongTask(self):
"""Long-running task in 5 steps."""
for i in range(5):
sleep(1)
self.reportProgress(i + 1)
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec())

[在这里找到:https://realpython.com/python-pyqt-qthread/]

他们将把runLongTask创建为一个新线程。但是它不引用Window类的任何成员或用户输入。

我的GUI有很多需要在线程中引用的用户输入。以下是我的示例的简化版本:

class Window(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.connectSignalsSlots()
self.line_names = ["Trigger", "Slave1"]
self.sources = [self.cmbTriggerSource, self.cmbSlaveLED1_Source]
for info in QtSerialPort.QSerialPortInfo.availablePorts():
self.cmbSerialPort.addItem(info.portName())
self.cmbSourceClosed()
def connectSignalsSlots(self):
self.btnSerialPortScan.clicked.connect(self.btnSerialPortScanClicked)
self.btnConfigure.clicked.connect(self.btnConfigureClicked)
self.btnTMInit.clicked.connect(self.btnTesterModule)
def btnSerialPortScanClicked(self):
self.cmbSerialPort.clear()
for info in QtSerialPort.QSerialPortInfo.availablePorts():
self.cmbSerialPort.addItem(info.portName())
def btnConfigureClicked(self):
# Open the serial port
port = self.openSerialPort()
message.append(self.sources[i].currentIndex())
self.sendData(port, message)
self.closeSerialPort(port)
def btnTesterModule(self):
port = self.openSerialPort2(self)
devices = cm.devices_list()
com_port = self.cmbSerialPort_tester.currentText()
a = self.LEDfrom.value()
b = self.LEDto.value() + 1
for i in range(a, b):
self.SetButtonColour(i, 0)
message.append((self.tester_LED[2].value() >> 24) & 0xff)
message.append((self.tester_LED[2].value() >> 16) & 0xff)
message.append((self.tester_LED[2].value() >> 8) & 0xff)
message.append(self.tester_LED[2].value() & 0xff)
self.selectObject(port, 3)
self.sendData(port, message)

其中btnTesterModule函数需要一段时间,并且需要在一个新线程中。正如你所看到的,它引用了很多self。对象,因此将其移动到一个新线程将不再允许它从GUI或函数中引用任何这些变量。

有没有人知道我如何能使一个新的线程,仍然可以访问我的窗口和GUI,只是初始化线程运行说,当按钮按下的功能?我只会使用基本的python线程,但为了使这个更复杂,我需要这个按钮的进度条,一旦它可以运行而不会崩溃GUI,所以需要插槽和信号,我理解QtThreads

更容易

别担心,我已经弄清楚了,如果你需要这样做,最好使用标准的python线程,因为PyQt5没有任何东西可以有效地处理这种情况。

一样:

import threading
def ScanButtonThread(self):
t = threading.Thread(target=self.btnTesterModule)
t.start()

那么把这个按钮连接到这个功能上,而不是另一个。

最新更新