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