PyQt5入门
1.PyQt5介绍
PyQt是一个创建GUI应用程序的工具包。它是Python编程语言和Qt库的成功融合。Qt库是最强大的库之一。PyQt是由Phil Thompson 开发。
PyQt实现了一个Python模块集。它有超过300类,将近6000个函数和方法。它是一个多平台的工具包,可以运行在所有主要操作系统上,包括UNIX,Windows和Mac。 PyQt采用双许可证,开发人员可以选择GPL和商业许可。在此之前,GPL的版本只能用在Unix上,从PyQt的版本4开始,GPL许可证可用于所有支持的平台。
他们被分成几个模块。 QtCore模块包含核心的非GUI功能。该模块用于时间、文件和目录、各种数据类型、流、网址、MIME类型、线程或进程。QtGui模块包含图形组件和相关的类,例如按钮、窗体、状态栏、工具栏、滚动条、位图、颜色、字体等。QtNetwork模块包含了网络编程的类,这些类允许编写TCP/IP和UDP的客户端和服务器,他们使网络编程更简单,更轻便。QtXml包含使用XML文件的类,这个模块提供了SAX和DOM API的实现。QtSvg模块提供显示的SVG文件的类。可缩放矢量图形(SVG)是一种用于描述二维图形和图形应用程序的XML语言。QtOpenGL模块使用OpenGL库渲染3D和2D图形,该模块能够无缝集成Qt的GUI库和OpenGL库。QtSql模块提供用于数据库的类。
2.简单操作
import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QApplication, QWidget
print(QT_VERSION_STR) # 查看当前Pyqt版本号
if __name__ == '__main__':
app = QApplication(sys.argv) # Qt实例化一个app 必须有且只有一个 sys.argv一个列表是当前文件的名称元素
w = QWidget() # 创建窗口
w.setWindowTitle("First PyQt") # 设置窗口标题名称
print(QT_VERSION_STR) # 获取版本号
w.show() # 展示窗口
app.exec() # 程序进入循环等待状态
3. QPushButton按钮
from PyQt5.QtWidgets import QPushButton
if __name__ == '__main__':
app = QApplication(sys.argv) # Qt实例化一个app 必须有且只有一个 sys.argv一个列表是当前文件的名称元素
w = QWidget() # 创建的一个窗口
w.setWindowTitle("First PyQt") # 设置窗口标题名称
btn = QPushButton("left Click") # 在窗口里面添加控件
btn.setParent(w) # 把当前按钮显示在W窗口 否则不会显示
w.show() # 展示窗口
app.exec() # 程序进入循环等待状态
4.QLabel纯文本
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
w.setWindowTitle('One Label')
label = QLabel('Username: ', w) # 创建一个纯文本Label 显示在W上面
label.setGeometry(200, 200, 300, 300) # 设置窗口大小
w.show()
app.exec()
5.QLineEdit输入框
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
w.setWindowTitle('one OLineEdit')
user = QLabel('账号:', w)
word = QLabel('密码:', w)
user.setGeometry(20, 20, 30, 20)
word.setGeometry(20, 50, 60, 20)
edit1 = QLineEdit(w) # 实例化输入框
edit2 = QLineEdit(w)
edit1.setPlaceholderText('请输入您的账号') # 文本提示内容
edit2.setPlaceholderText('请输入您的密码')
edit1.setGeometry(55, 20, 200, 20)
edit2.setGeometry(55, 50, 200, 20)
btn = QPushButton('登录', w)
btn.setGeometry(100, 80, 70, 30)
w.show()
app.exec()
6.设置窗口位置
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
w.setWindowTitle('one OLineEdit')
center_pointer = QDesktopWidget().availableGeometry().center() # 调整窗口在屏幕正中间显示
# print(center_pointer) # PyQt5.QtCore.QPoint(742, 462)
x = center_pointer.x()
y = center_pointer.y()
# w.move(x-150, y-150) # 如果有设置窗口大小 需要减去xy一半的值 保证在中间
# print(w.frameGeometry()) # PyQt5.QtCore.QRect(0, 0, 640, 480) 依次 是窗口位置 及窗口高宽
# print(w.frameGeometry().getRect()) # (0, 0, 640, 480)
# print(type(w.frameGeometry().getRect())) # <class 'tuple'>
old_x, old_y, width, height = w.frameGeometry().getRect()
w.move(x - width / 2, y - height / 2) # 减去设置的窗口大小一般 居中
w.show()
app.exec()
7.修改窗口图标
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
w.setWindowTitle('setIcon')
w.setWindowIcon(QIcon('111.png'))
w.show()
app.exec()
8.PyQt布局
在QT里面布局分为四个大类: QBoxLayout、QGridLayout、QFormLayout、QStackedLayOut
表格 网格 表单 抽屉式‘
盒子布局分为两个子类 QHBoxLayOut 、 QVBoxLayOut 负责垂直和水平布局
1> 垂直布局
import sys
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QPushButton
class MyWindow(QWidget):
def __init__(self):
super().__init__() # 调用父类的init方法
self.resize(300, 300) # 设置大小
self.setWindowTitle('Vertical LayOut') # 设置标题
layout = QVBoxLayout() # 创建垂直对象
btn1 = QPushButton('No.1') # 创建按钮添加到布局
layout.addWidget(btn1)
btn2 = QPushButton('NO.2')
layout.addWidget(btn2)
btn3 = QPushButton('NO.3')
layout.addWidget(btn3)
# layout.addStretch(2) # 添加伸缩器 每一个按钮前加上一个则平均分配 如果不写也则也是平均分
self.setLayout(layout) # 让当前窗口使用当前排列规则布局
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()
2> 水平布局
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QGroupBox, QRadioButton, QHBoxLayout
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
container = QVBoxLayout() # 创建垂直布局
hobby_box = QGroupBox('爱好') # 分组
v_layout = QVBoxLayout()
btn1 = QRadioButton('抽烟') # 添加单选框
btn2 = QRadioButton('喝酒')
btn3 = QRadioButton('烫头')
v_layout.addWidget(btn1) # 添加到布局中
v_layout.addWidget(btn2)
v_layout.addWidget(btn3)
hobby_box.setLayout(v_layout) # 容器使用当前V布局
gender_box = QGroupBox('性别')
h_layout = QHBoxLayout()
btn4 = QRadioButton('boys')
btn5 = QRadioButton('girls')
btn6 = QRadioButton('gays')
h_layout.addWidget(btn4)
h_layout.addWidget(btn5)
h_layout.addWidget(btn6)
gender_box.setLayout(h_layout) # 容器使用当前H布局
container.addWidget(hobby_box) # 把爱好添加到容器当中
container.addWidget(gender_box) # 把性别添加到容器当中
self.setLayout(container) # 设置当前窗口显示容器内容
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()
9.Pyqt简单登录
import time, json, sys
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.ui = uic.loadUi('./untitled1.ui')
# print(self.ui)
# print(self.ui.__dict__) # 获取当前UI可使用的对象
# print(self.ui.label.text()) # 获取Label内容
self.username = self.ui.lineEdit
self.password = self.ui.lineEdit_2
self.login_btn = self.ui.pushButton
self.forget_btn = self.ui.pushButton_2
self.text = self.ui.textBrowser
self.login_btn.clicked.connect(self.login) # 绑定信号与槽函数
self.password.setEchoMode(QLineEdit.Password) # 把当前密码设置成隐藏
def login(self):
username = self.username.text()
password = self.password.text()
for i in range(3):
print('正在登录服务器...... %d' % (i + 1))
time.sleep(1)
if username == 'Like' and password == '123':
self.text.setText('欢迎%s登录!' % username)
self.text.repaint()
else:
self.text.setText('当前用户名密码错误!')
self.text.repaint()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.ui.show()
app.exec()
10.PyQt线程的使用
import sys
import time
from PyQt5 import uic
from PyQt5.Qt import QApplication, QWidget, QThread
class MyThread(QThread):
def __init__(self):
super().__init__()
def run(self):
for i in range(5):
print('MyThread线程 %d 正在执行' % (i + 1))
time.sleep(1)
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.ui = uic.loadUi('./untitled2.ui')
print(self.ui.__dict__)
text = 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('CLick1线程%d' % (i + 1))
time.sleep(1)
def click_2(self):
self.mythread = MyThread() # 创建线程 不加self的话引用技数为0则会回收 就会报错
self.mythread.start() # 启动线程
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.ui.show()
app.exec()
11.QtDiaLog
import sys
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton
class MyDialog(QDialog):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
left_btn = QPushButton('Left', self)
right_btn = QPushButton('right', self)
left_btn.setGeometry(0, 0, 100, 30)
right_btn.setGeometry(50, 50, 100, 30)
self.setWindowTitle('对话框')
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyDialog()
w.show()
app.exec()
12.QtMainWindow
import sys
from PyQt5.QtWidgets import QMainWindow, QLabel, QApplication
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
label = QLabel('This is Title')
label.setStyleSheet("font-size:20px; color: red; background-color:pink;")
menu = self.menuBar()
menu.setNativeMenuBar(False)
file_menu = menu.addMenu('File') # 添加一级标题
file_menu.addAction('New Object...')
file_menu.addAction('save as')
file_menu.addAction('Open')
file_menu = menu.addMenu('Edit') # 添加一级标题
file_menu.addAction('Cut')
file_menu.addAction('Copy')
file_menu.addAction('Paste')
label.setGeometry(200, 200, 300, 300,)
self.setCentralWidget(label) # 设置窗口在中心位置显示
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()
13.QT自定义信号
import sys, time
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.Qt import pyqtSignal
class MyWindow(QWidget):
signal = pyqtSignal(str)
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.resize(300, 200)
btn = QPushButton("开始检查", self)
btn.setGeometry(0, 0, 200, 200)
btn.clicked.connect(self.check)
self.signal.connect(self.my_solt)
def check(self):
for i, ip in enumerate(['192.168.1.%d' % x for x in range(1, 255)]):
msg = '正在检查 %s 上的漏洞' % ip
print(msg)
if i % 5 == 0:
self.signal.emit(msg + 'Look One Bug')
# else:
# self.signal.emit('')
# time.sleep(0.01)
def my_solt(self, msg):
print('>>>>', msg)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()