文章目录
- 🍔使用QtDesigner进行设计
- 🛸和子线程进行通信
- 🎈运行结果
🍔使用QtDesigner进行设计
我们首先使用QtDesigner设计界面
得到代码login.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>478</width>
<height>220</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>20</x>
<y>30</y>
<width>72</width>
<height>15</height>
</rect>
</property>
<property name="text">
<string>用户名:</string>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>21</x>
<y>74</y>
<width>71</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>密码:</string>
</property>
</widget>
<widget class="QTextBrowser" name="textBrowser">
<property name="geometry">
<rect>
<x>215</x>
<y>20</y>
<width>201</width>
<height>91</height>
</rect>
</property>
</widget>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>10</x>
<y>150</y>
<width>93</width>
<height>28</height>
</rect>
</property>
<property name="text">
<string>登录</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_2">
<property name="geometry">
<rect>
<x>140</x>
<y>150</y>
<width>93</width>
<height>28</height>
</rect>
</property>
<property name="text">
<string>忘记密码</string>
</property>
</widget>
<widget class="QLineEdit" name="lineEdit">
<property name="geometry">
<rect>
<x>80</x>
<y>30</y>
<width>113</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="lineEdit_2">
<property name="geometry">
<rect>
<x>80</x>
<y>70</y>
<width>113</width>
<height>21</height>
</rect>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
🛸和子线程进行通信
import json
import sys
import time
from PyQt5 import uic
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget
class LoginThread(QThread):
#创建自定义信号
start_login_signal=pyqtSignal(str)
def __init__(self):
super().__init__()
def login_by_requests(self,user_password_json):
# 将json字符串转换为自定义字符串,实现传递用户名和密码
# json.loads()方法能够将符合JSON格式的字符串转换为Python的字典或列表等数据类型。
user_password_json=json.loads(user_password_json)
print(user_password_json.get("user_name"))
print(user_password_json.get("password"))
def run(self):
# 让子线程一直存活,便于接收来自主线程的任务
while True:
print("子线程正在执行")
time.sleep(1)
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.ui=uic.loadUi("./login.ui")
self.user_name=self.ui.lineEdit
self.password=self.ui.lineEdit_2
self.login_btn=self.ui.pushButton
self.forget_btn=self.ui.pushButton_2
self.text_Browser=self.ui.textBrowser #文本显示区域
# 创建一个子线程
self.login_thread=LoginThread()
# 绑定信号和槽函数
self.login_btn.clicked.connect(self.login) #点击后,调用login函数
# 将要创建的子线程类中的信号进行绑定
# 写下self.login_thread = LoginThread()时,实际上是调用了LoginThread类,并创建了一个该类的实例对象,并将其赋值给了self.login_thread变量。
# 简而言之,self.login_thread就是LoginThread()这个类的一个实例。
# 当start_login_signal信号被触发时,就会自动调用login_by_requests方法来进行登录操作。
self.login_thread.start_login_signal.connect(self.login_thread.login_by_requests)
# 让子线程开始工作
self.login_thread.start()
def login(self):
# 登录按钮的槽函数
user_name=self.user_name.text()
password=self.password.text()
# 发送信号给子线程
self.login_thread.start_login_signal.emit(json.dumps({"user_name":user_name,"password":password}))
if __name__=='__main__':
app=QApplication(sys.argv)
w=MyWindow()
w.ui.show()
app.exec_()