文章目录
- 🍔使用QtDesigner进行设计
- 🛸实现多线程
- 🌹效果
- 🔎原因
🍔使用QtDesigner进行设计
对应的代码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 sysimport time
from PyQt5 import uic
from PyQt5.QtCore import QThread
from PyQt5.QtWidgets import QApplication, QWidgetclass 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.lineEditbtn1=self.ui.pushButtonbtn2=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()
🌹效果
我们点击第一个按钮后,不能向文本框里面输入内容
直到循环结束
当我们按第二个按钮的时候,能够输入内容
🔎原因
一个线程是在主线程(UI线程)中运行的
,当在主线程中执行耗时操作时(例如click_1方法中的for循环),它会阻塞主线程
,导致界面无响应。
另一方面,使用QThread创建的线程会在后台运行,不会阻塞主线程
。这是因为QThread类提供了一个事件循环,可以在后台处理线程的任务,而不会影响到线程的响应性。(这个属于自己创建的线程,不属于主线程)