如何在不影响其他事件的情况下实时更新文本(pyqt)

2024-10-01 02:23:28 发布

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

在我的程序中,我想不断地将文本设置到文本浏览器中,但当我单击另一个按钮时,它似乎有延迟。我的密码是:

class Ui_MainWindow(QWidget):
  def __init__(self):
    QWidget.__init__(self)
    self.setupUi(self)
    self.th0 = TestThread()
    self.pushButton.clicked.connect(self.runthread)

  def runthread(self):
    self.th0.start()
    self.chilWid.Consumer()
    QtGui.qApp.processEvents()

  def setupUi(self, Widget):             
    self.gridLayout = QtGui.QGridLayout()
    self.pushButton = QtGui.QPushButton()
    self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
    self.chilWid = ChildWid()
    self.gridLayout.addWidget(self.chilWid, 1, 0, 1, 1)

    self.setLayout(self.gridLayout)

manager = Manager()
manager2 = Manager()
q = manager.Queue()
q2 =manager2.Queue()
l = manager.Lock()
l2 =manager2.Lock()

这个类是一个线程,它将控制生产者

^{pr2}$

这个类只包含一个文本浏览器,将由类MainWindow插入。它还从队列中收集数据并显示在文本浏览器上

class ChildWid(QWidget):
 def __init__(self):
    QWidget.__init__(self)
    self.text = QTextEdit()
    self.lay = QHBoxLayout(self)
    self.lay.addWidget(self.text)

 def Consumer(self):
    global q, q2, q3,l,l2,l3
    while True:
        try:
            task = q.get(block=False)
            QtGui.qApp.processEvents()
            self.text.setText(str(task))
        except:
            pass

当我单击pushButton时,文本浏览器将正常显示由Producer生成的文本。但另一个按钮如pushbutton或整个用户界面的响应非常慢。对我有什么建议吗?谢谢

**********新更新

class TestThread(QThread,QObject):
testsinal = pyqtSignal(str)

def __init__(self):
     . . .
    self.t = ChildWid()

def TestSignal(self):
    self.testsinal.emit('some text message')
    self.testsinal.connect(self.handle)
@QtCore.pyqtSlot(str)
def handle(self,str):
    print str
    self.t.text.setText(str)

def run(self):
    print"Thread run normally"
    while (self.stopped):
        ps0 = Process(target=L2PS_v1a4.main, args=(q, l, 'eth0', q2, l2, q3))
        ps0.start()

        self.TestSignal()

Tags: text文本selfinitdef浏览器classstr
1条回答
网友
1楼 · 发布于 2024-10-01 02:23:28

带有阻塞while循环的Consumer方法看起来真的很讨厌。它试图表现得像某种假事件循环,但它不可能像真的那样高效地运行。把它扔掉。在

正确的方法是在TestThread类上定义一个自定义信号,然后使用它从run()方法中发出文本消息。跨线程信号是线程安全的,并被发送到接收线程的事件队列中。这意味着它们是异步处理的,因此不会阻塞GUI:

class TestThread(QThread):
    testSignal = QtCore.pyqtSignal(str)
    ...

    def run(self):
        while (not self.stopped):
            ps0 = Process(target=Producer, args=(q, l, 'eth0', q2, l2))        
            ps0.start()
            self.testSignal.emit('some text message')


class ChildWid(QWidget):
    ...

    QtCore.pyqtSlot(str)
    def handleTestSignal(self, message):
        print(message)
        self.text.setText(message)


class Ui_MainWindow(QWidget):
    def __init__(self):
        ...
        self.th0.testSignal.connect(self.chilWid.handleTestSignal)

相关问题 更多 >