【PyQt5篇】多线程-LMLPHP

🍔使用QtDesigner进行设计

【PyQt5篇】多线程-LMLPHP

【PyQt5篇】多线程-LMLPHP
对应的代码btn.ui

<?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>205</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <widget class="QLineEdit" name="lineEdit">
   <property name="geometry">
    <rect>
     <x>90</x>
     <y>60</y>
     <width>231</width>
     <height>31</height>
    </rect>
   </property>
  </widget>
  <widget class="QPushButton" name="pushButton">
   <property name="geometry">
    <rect>
     <x>90</x>
     <y>130</y>
     <width>93</width>
     <height>28</height>
    </rect>
   </property>
   <property name="text">
    <string>按钮1—卡</string>
   </property>
  </widget>
  <widget class="QPushButton" name="pushButton_2">
   <property name="geometry">
    <rect>
     <x>230</x>
     <y>130</y>
     <width>93</width>
     <height>28</height>
    </rect>
   </property>
   <property name="text">
    <string>按钮2—不卡</string>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

🛸实现多线程

代码如下

import sys

import time
from PyQt5 import uic
from PyQt5.QtCore import QThread
from PyQt5.QtWidgets import QApplication, QWidget


class MyThread(QThread):
    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(5):
            print("是线程中执行...%d" % (i+1))
            time.sleep(1)


class MyWin(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.ui=uic.loadUi('./bun.ui',self)

        lineedit=self.ui.lineEdit
        btn1=self.ui.pushButton
        btn2=self.ui.pushButton_2

        # 绑定槽函数
        btn1.clicked.connect(self.click_1)
        btn2.clicked.connect(self.click_2)

    def click_1(self):
        for i in range(5):
            print("================= 卡的线程  =================中执行...%d"%(i+1))
            time.sleep(1)

    def click_2(self):
        self.my_thread=MyThread()
        self.my_thread.start()



if __name__ == '__main__':
    app = QApplication(sys.argv)
    mywin = MyWin()
    mywin.ui.show()
    app.exec()

🌹效果

我们点击第一个按钮后,不能向文本框里面输入内容
直到循环结束
【PyQt5篇】多线程-LMLPHP
当我们按第二个按钮的时候,能够输入内容
【PyQt5篇】多线程-LMLPHP

🔎原因

一个线程是在主线程(UI线程)中运行的,当在主线程中执行耗时操作时(例如click_1方法中的for循环),它会阻塞主线程,导致界面无响应。

另一方面,使用QThread创建的线程会在后台运行,不会阻塞主线程。这是因为QThread类提供了一个事件循环,可以在后台处理线程的任务,而不会影响到线程的响应性。()

04-07 06:10