如何在PyQT5中暂停/播放线程?

2024-10-01 09:23:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用PyQT5制作一个简单的GUI程序。在

但现在我遇到了一些关于线的问题。在

我只做了一个简单的测试程序,比如bottom:

该程序只是试图将数字附加到textbox,但它崩溃了。在

我不知道为什么,但不知怎么的,我可以通过删除一条评论来阻止它(时间。睡觉)在

import sys
import threading
import time
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

class Some(QWidget):
    e = threading.Event()

    def btnfunc(self):
        self.e.set()        

    def __init__(self):
        super().__init__()
        self.myButton = QPushButton('do next')
        self.logs = QTextEdit()

        self.mylay = QVBoxLayout()
        self.mylay.addWidget(self.myButton)
        self.mylay.addWidget(self.logs)

        self.setLayout(self.mylay)
        self.setGeometry(300, 300, 300, 550)
        self.setWindowTitle('mytest')
        self.show()
        t = threading.Thread(target=self.myfunc, args=( ))
        t.start()
        self.myButton.clicked.connect(self.btnfunc)

    def myfunc(self):
        for i in range(300):
            # time.sleep(0.4)
            self.logs.append(str(i))
            if i == 20:
                self.e.wait()

app = QApplication(sys.argv)
ex = Some()
sys.exit(app.exec_())

如果把时间定得高一点就更好了。在

我认为这是因为资源访问,因为它是pyqt5gui。在

所以我找到了QThread。我试过像屁股一样

^{pr2}$

但撞车,没用。尝试了QThread+线程。事件(). 它冻结GUI。在

现在我不知道该怎么做。。。在

编辑: 我刚刚意识到了线。不应从除QThread之外的其他线程访问。 那我就继续查QWaitCondition


Tags: fromimportself程序timedefsys时间
1条回答
网友
1楼 · 发布于 2024-10-01 09:23:43

您不应该通过多线程直接控制GUI。由于两个不同的线程试图控制GUI,这将导致冻结或崩溃。 我从这里学到了这个概念http://www.xyzlang.com/python/PyQT5/pyqt_multithreading.html

这是你的代码,可以完美地工作。在

import sys
import threading
import time
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

# Added new
class Communicate(QObject):
    signal = pyqtSignal(str)

class Some(QWidget):
    e = threading.Event()

    def btnfunc(self):
        self.e.set()        

    def __init__(self):
        super().__init__()

        #communicate object
        self.comm = Communicate()
        self.comm.signal.connect(self.append_data)

        self.myButton = QPushButton('do next')
        self.logs = QTextEdit()

        self.mylay = QVBoxLayout()
        self.mylay.addWidget(self.myButton)
        self.mylay.addWidget(self.logs)

        self.setLayout(self.mylay)
        self.setGeometry(300, 300, 300, 550)
        self.setWindowTitle('mytest')
        self.show()
        t = threading.Thread(target=self.myfunc, args=( ))
        t.start()
        self.myButton.clicked.connect(self.btnfunc)

    def myfunc(self):
        for i in range(300):
            # time.sleep(0.4)
            #self.logs.append(str(i))
            self.comm.signal.emit(str(i))
            if i == 20:
                self.e.wait()

    def append_data(self, data):
        self.logs.append(data)

app = QApplication(sys.argv)
ex = Some()
sys.exit(app.exec_())

相关问题 更多 >