gpt4 book ai didi

python - 当我在 python pyqt 上关闭 gui 时,Qthread 仍在工作

转载 作者:太空宇宙 更新时间:2023-11-03 14:09:47 27 4
gpt4 key购买 nike

我的代码有线程,但是当我关闭 gui 时,它仍然在后台运行。我怎样才能停止线程?有什么东西停止(),关闭()?我不使用信号,插槽?我必须使用这个吗?

from PyQt4 import QtGui, QtCore
import sys
import time
import threading

class Main(QtGui.QMainWindow):
def __init__(self, parent=None):
super(Main, self).__init__(parent)
self.kac_ders=QtGui.QComboBox()
self.bilgi_cek=QtGui.QPushButton("Save")
self.text=QtGui.QLineEdit()
self.widgetlayout=QtGui.QFormLayout()
self.widgetlar=QtGui.QWidget()
self.widgetlar.setLayout(self.widgetlayout)
self.bilgiler=QtGui.QTextBrowser()
self.bilgi_cek.clicked.connect(self.on_testLoop)
self.scrollArea = QtGui.QScrollArea()
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setWidget(self.widgetlar)
self.analayout=QtGui.QVBoxLayout()
self.analayout.addWidget(self.text)
self.analayout.addWidget(self.bilgi_cek)
self.analayout.addWidget(self.bilgiler)
self.centralWidget=QtGui.QWidget()
self.centralWidget.setLayout(self.analayout)
self.setCentralWidget(self.centralWidget)

def on_testLoop(self):
self.c_thread=threading.Thread(target=self.kontenjan_ara)
self.c_thread.start()

def kontenjan_ara(self):

while(1):
self.bilgiler.append(self.text.text())
time.sleep(10)


app = QtGui.QApplication(sys.argv)
myWidget = Main()
myWidget.show()
app.exec_()

最佳答案

一些事情:

  1. 您不应该从主线程外部调用 GUI 代码。 GUI 元素不是线程安全的。 self.kontenjan_ara 更新和读取 GUI 元素,它不应该是您的线程的目标。

  2. 几乎在所有情况下,您都应该使用QThreads 而不是python 线程。它们与 Qt 中的事件和信号系统很好地集成。

如果你只想每隔几秒运行一次,你可以使用QTimer

def __init__(self, parent=None):
...
self.timer = QTimer(self)
self.timer.timeout.connect(self.kontenjan_ara)
self.timer.start(10000)

def kontenjan_ara(self):
self.bilgiler.append(self.text.text())

如果您的线程操作在计算上更复杂,您可以创建一个工作线程并使用信号在工作线程和主 GUI 线程之间传递数据。

class Worker(QObject):

work_finished = QtCore.pyqtSignal(object)

@QtCore.pyqtSlot()
def do_work(self):
data = 'Text'
while True:
# Do something with data and pass back to main thread
data = data + 'text'
self.work_finished.emit(data)
time.sleep(10)


class MyWidget(QtGui.QWidget):

def __init__(self, ...)
...
self.worker = Worker()
self.thread = QtCore.QThread(self)
self.worker.work_finished.connect(self.on_finished)
self.worker.moveToThread(self.thread)
self.thread.started.connect(self.worker.do_work)
self.thread.start()

@QtCore.pyqtSlot(object)
def on_finished(self, data):
self.bilgiler.append(data)
...

当主线程退出事件循环时,Qt 会自动杀死所有的子线程。

关于python - 当我在 python pyqt 上关闭 gui 时,Qthread 仍在工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39604903/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com