首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python语言中创建用于PyQt的线程

如何在Python语言中创建用于PyQt的线程
EN

Stack Overflow用户
提问于 2018-10-06 18:31:49
回答 1查看 613关注 0票数 1

我正在尝试理解如何在Pyqt中使用线程,并且正在努力学习任何教程,因为它们中的大多数都是基于从头开始通过类创建的接口。我已经用Qt designer创建了我的界面,我不知道如何使用线程来运行程序,并在没有冻结的情况下更新界面。我的示例代码如下:

代码语言:javascript
复制
import sys
from PyQt5 import uic, QtWidgets

def task():
    for i in range (1,100000):
    html = ("<p style = 'color:blue;'> <b> Completed: %s <b> <p><br>") % i
    window.plainTextEdit.appendHtml(html)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = uic.loadUi('test.ui')
    window.show()
    window.pushButton.clicked.connect(task)
    sys.exit(app.exec_())

我也喜欢添加一个进度条,可以在它自己的线程上运行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-06 22:19:55

你需要热爱的课程,越快越好!您需要的一个选项可能如下所示:

代码语言:javascript
复制
import sys
import threading
from PyQt5 import QtWidgets, QtCore   # ,uic 


def thread(my_func):
    """  Runs a function in a separate thread. """
    def wrapper(*args, **kwargs):
        my_thread = threading.Thread(target=my_func, args=args, kwargs=kwargs)
        my_thread.start()
    return wrapper

@thread
def processing(signal):
    """ Emulates the processing of some data. """
    ind = 1
    for i in range (1,10001):                                     # +++
        html = ("<p style='color:blue;'> Completed: <b>%s </b> </p> <br>") % i
        QtCore.QThread.msleep(5)
        ind = ind if i%100!=0 else ind+1                          # +++
        signal.emit(html, ind)                                    # +++ 



def mySignalHandler(html, val):          # Called to process a signal
    plainTextEdit.appendHtml(html)
    progressBar.setValue(val)


class WindowSignal(QtWidgets.QWidget):
    """ New signals can be defined as class attributes using the pyqtSignal() factory. """
    my_signal = QtCore.pyqtSignal(str, int, name='my_signal')


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    window = WindowSignal()

    button = QtWidgets.QPushButton("Emit your signal!", window)
    button.clicked.connect(lambda: processing(window.my_signal))

    # since you do not publish test.ui, I replaced it with the line below:
    plainTextEdit = QtWidgets.QPlainTextEdit(window)
    progressBar = QtWidgets.QProgressBar()
    progressBar.setTextVisible(False)


    layoutHBox = QtWidgets.QHBoxLayout()
    layoutHBox.addWidget(button)
    layoutHBox.addWidget(plainTextEdit)

    layoutVBox = QtWidgets.QVBoxLayout()
    window.setLayout(layoutVBox)
    layoutVBox.addLayout(layoutHBox)
    layoutVBox.addWidget(progressBar)

    window.my_signal.connect(mySignalHandler, QtCore.Qt.QueuedConnection)

    window.show()

    sys.exit(app.exec_())

示例2:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <widget class="QWidget" name="">
   <property name="geometry">
    <rect>
     <x>12</x>
     <y>12</y>
     <width>371</width>
     <height>281</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
       <widget class="QPushButton" name="button">
        <property name="text">
         <string>Emit your signal!</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPlainTextEdit" name="plainTextEdit"/>
      </item>
     </layout>
    </item>
    <item>
     <widget class="QProgressBar" name="progressBar">
      <property name="value">
       <number>0</number>
      </property>
      <property name="textVisible">
       <bool>false</bool>
      </property>
      <property name="invertedAppearance">
       <bool>false</bool>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

main.py

代码语言:javascript
复制
import sys
import threading
from PyQt5 import QtWidgets, QtCore, uic 


def thread(my_func):
    """  Runs a function in a separate thread. """
    def wrapper(*args, **kwargs):
        my_thread = threading.Thread(target=my_func, args=args, kwargs=kwargs)
        my_thread.start()
    return wrapper

@thread
def processing(signal):
    """ Emulates the processing of some data. """
    for i in range (1,101):   # (1,100000)
        html = ("<p style='color:blue;'> Completed: <b>%s </b> </p> <br>") % i
        QtCore.QThread.msleep(10)
        signal.emit(html, i)     # Send a signal in which we transfer the received data


def mySignalHandler(html, val):          # Called to process a signal
    window.plainTextEdit.appendHtml(html)
    window.progressBar.setValue(val)


class WindowSignal(QtWidgets.QWidget):
    """ New signals can be defined as class attributes using the pyqtSignal() factory. """
    my_signal = QtCore.pyqtSignal(str, int, name='my_signal')


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    window = WindowSignal()
    uic.loadUi('test.ui', window)    

    window.button.clicked.connect(lambda: processing(window.my_signal))
    window.my_signal.connect(mySignalHandler, QtCore.Qt.QueuedConnection)

    window.show()

    sys.exit(app.exec_())

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52678120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档