Python Pyqt5入门
目录
一、入门——创建简单的界面
二、模块介绍
控件:按钮、文本、输入框(文本框)
1、按钮——QPushButton&QRadioButton
2、文本——QLabel
3、输入框(文本框)——QLineEdit
布局(约束):盒子布局(最常用)、网格布局(九宫格布局)、表单布局、抽屉布局
1、盒子布局——QBoxLayout
2、网格布局(九宫格布局)——QGridLayout
3、表单布局 ——QFormLayout
4、抽屉布局——QStackedLayout
窗口:QWidget、QMainWindow、QDialog
1、QWidget:
2、QMainWindow:
3、QDialog:
信号与槽:接受信号、自定义信号
1、接受信号
2、自定义信号
三、ui文件
一、入门——创建简单的界面
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QIcon
import sys
if __name__=="__main__":
app=QApplication(sys.argv)#相当于打开界面(①不能少)
w=QWidget()#创建界面对象
w.setWindowTitle("第一个标题") #设置窗口标题
w.resize(300,300)#设置窗口大小
#w.move(0,0)#设置窗口在屏幕的位置,(0,0)为左上角
w.setWindowIcon(QIcon("./bg.png"))#设置窗口图标
w.show()#展示窗口
app.exec_()#程序进行循环等待状态 相当于检测界面(②不能少)
效果:
二、模块介绍
常用的三个功能模块:
- QtCore:包含了核心的非GUI的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime类文件、进程与线程一起使用
- QtGui:包含了窗口系统、事件处理、2D图像、基本绘画、字体和文字类
- QtWidgets:包含了一些列创建桌面应用的UI元素
控件:按钮、文本、输入框(文本框)
1、按钮——QPushButton&QRadioButton
QPushButton:
from PyQt5.QtWidgets import QApplication,QWidget
import sys
from PyQt5.QtWidgets import QPushButton
if __name__=="__main__":
app=QApplication(sys.argv)#相当于打开界面(①不能少)
w=QWidget()#创建界面对象
w.setWindowTitle("第一个标题") #设置窗口标题
#创建按钮
btn=QPushButton("按钮")
btn.setParent(w)#设置按钮btn为当前w窗口的,相当于再w窗口中显示这btn按钮
w.show()#展示窗口
app.exec_()#程序进行循环等待状态 相当于检测界面(②不能少)
效果:
QRadioButton:
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QIcon
import sys
from PyQt5.QtWidgets import QRadioButton
if __name__=="__main__":
app=QApplication(sys.argv)#相当于打开界面(①不能少)
w=QWidget()
w.resize(300,300)
btn1=QRadioButton("男",w)
btn1.setGeometry(10,0,30,30)#按钮存放的位置,在(20,20)位置,宽高为(300,30)
btn2=QRadioButton("女",w)
btn2.setGeometry(40,0,30,30)
w.show()#展示窗口
app.exec_()#程序进行循环等待状态 相当于检测界面(②不能少)
效果:
2、文本——QLabel
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtWidgets import QLabel
import sys
if __name__=="__main__":
app=QApplication(sys.argv)#相当于打开界面(①不能少)
w=QWidget()#创建界面对象
w.setWindowTitle("第一个标题") #设置窗口标题
#创建文本
#方法一(同上,使用调用方法来指定父类)
label=QLabel("账号:")
label.setParent(w)
#方法二(创建时就指定父类)
label=QLabel("账户:",w)
#设置文本位置与大小
label.setGeometry(20,20,300,30)#在(20,20)位置,宽高为(300,30)
w.show()#展示窗口
app.exec_()#程序进行循环等待状态 相当于检测界面(②不能少)
效果:
注意:
文本位置:是以红色点为原点
3、输入框(文本框)——QLineEdit
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtWidgets import QLabel
from PyQt5.QtWidgets import QLineEdit
import sys
if __name__=="__main__":
app=QApplication(sys.argv)#相当于打开界面(①不能少)
w=QWidget()#创建界面对象
w.setWindowTitle("第一个标题") #设置窗口标题
#创建文本
label=QLabel("账户:",w)
#设置文本位置与大小
label.setGeometry(20,20,300,30)#在(20,20)位置,宽高为(300,30)
#创建文本框(输入框)
edit=QLineEdit(w)
edit.setPlaceholderText("请输入账号")
edit.setGeometry(55,20,200,20)
#创建按钮
btn=QPushButton("按钮",w)
btn.setGeometry(50,80,70,30)
w.show()#展示窗口
app.exec_()#程序进行循环等待状态 相当于检测界面(②不能少)
效果:
总结&补充:
①设置位置大小:xx.setGeometry(x,y,w,h) #xx为控件对象,(x,y),宽w,高h
②返回位置大小:xx.frameGeometry().getRect() #元组
③去掉标题栏(即窗口标题与图标不显示):from PyQt5 import Qt w.setWindowFlags(Qt.Qt.CustomizeWindowHint)
布局(约束):盒子布局(最常用)、网格布局(九宫格布局)、表单布局、抽屉布局
使用布局器时,控件可以不指定父对象,直接加入到布局器即可。
(即在最后时,让当前窗口的布局器使用这个布局器:self.setLayout(layout) )
1、盒子布局——QBoxLayout
一般使用它的两个子类QHBoxLayout(水平)和QVBoxLayout(垂直)
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton
from PyQt5.QtGui import QIcon
import sys
from PyQt5.QtWidgets import QVBoxLayout
class MyWindow(QWidget):
def __init__(self) :
super(QWidget,self).__init__()
self.setWindowTitle("第一个标题")
self.resize(300,300)
#垂直布局
layout=QVBoxLayout()
btn1=QPushButton("按钮1")
layout.addWidget(btn1)#添加到布局器
btn2=QPushButton("按钮2")
layout.addWidget(btn2)
btn3=QPushButton("按钮3")
layout.addWidget(btn3)
#layout.addStretch(2)#添加一个伸缩器(用于分配布局器在页面的布局)
self.setLayout(layout)#让当前窗口的布局器使用这个布局器
if __name__=="__main__":
app=QApplication(sys.argv)#相当于打开界面(①不能少)
w=MyWindow()
w.show()#展示窗口
app.exec_()#程序进行循环等待状态 相当于检测界面(②不能少)
效果:
综合应用:
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton
from PyQt5.QtGui import QIcon
import sys
from PyQt5.QtWidgets import QVBoxLayout
from PyQt5.QtWidgets import QHBoxLayout
from PyQt5.QtWidgets import QGroupBox
from PyQt5.QtWidgets import QRadioButton
class MyWindow(QWidget):
def __init__(self) :
super(QWidget,self).__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle("第一个标题")
self.resize(300,300)
#“爱好”
hobby_group=QGroupBox("爱好")#创建一个“爱好组”(相当于将“爱好”设置一个组,可以作为垂直布局的一个标题)
h_layout=QVBoxLayout()#创建“爱好”的垂直布局
btn1=QRadioButton("抽烟")
btn2=QRadioButton("喝酒")
btn3=QRadioButton("唱歌")
h_layout.addWidget(btn1)
h_layout.addWidget(btn2)
h_layout.addWidget(btn3)
hobby_group.setLayout(h_layout)
#“性别”
gender_group=QGroupBox("性别")#创建一个“性别组”(相当于将“性别”设置一个组,可以作为水平布局的一个标题)
g_layout=QHBoxLayout()#创建“性别”的水平布局
btn4=QRadioButton("男")
btn5=QRadioButton("女")
g_layout.addWidget(btn4)
g_layout.addWidget(btn5)
gender_group.setLayout(g_layout)
#外层上下布局:将“爱好”与“性别”同时放入一个垂直布局里,最后让当前窗口的布局器使用这个布局器
container=QVBoxLayout()
container.addWidget(hobby_group)
container.addWidget(gender_group)
self.setLayout(container)#让当前窗口的布局器使用这个布局器
if __name__=="__main__":
app=QApplication(sys.argv)#相当于打开界面(①不能少)
w=MyWindow()
w.show()#展示窗口
app.exec_()#程序进行循环等待状态 相当于检测界面(②不能少)
总结:1、布局中嵌套控件、组(都用:布局.addWidget(控件/组))
2、组嵌套布局(都用:组.setLayout(布局) )
3、当前窗口使用这个布局(self.setLayout(布局))
2、网格布局(九宫格布局)——QGridLayout
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLineEdit
from PyQt5.QtWidgets import QGridLayout
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle("计算器")
## 输入框
edit = QLineEdit()
edit.setPlaceholderText("请输入内容")
## 网格布局
grid = QGridLayout()
#方法一:
# 准备数据
data = {
0: ["7", "8", "9", "+", "("],
1: ["4", "5", "6", "-", ")"],
2: ["1", "2", "3", "*", ">>>",end='')
def detection(self):
print("开始检测:")
msg="发现bug"
for i in range(1,101):
if i%5==0:
self.my_signal.emit(msg)#发射信号(触发执行my_signal绑定的槽函数my_slot())。这里emit()一定要传一个字符串参数
print("192.169.1.{}".format(i))
if __name__ == "__main__":
app = QApplication(sys.argv)
win = MyWindow()
win.show()
app.exec()
效果:
综合应用:
将输出在终端的结果在窗口上显示
import sys from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QVBoxLayout,QLabel,QHBoxLayout,QScrollArea from PyQt5.QtCore import pyqtSignal,Qt class MyWindow(QWidget): my_signal=pyqtSignal(str)#声明一个信号 只能放在函数的外面 def __init__(self): super().__init__() self.msg_lst=[]#记录msg内容 self.init_ui() def init_ui(self): self.resize(500,200) self.container=QVBoxLayout()#整体 self.content_layout=QVBoxLayout() self.button_layout=QHBoxLayout() self.msg=QLabel("111")#QLabel可以放入图片或文字 self.msg.resize(440,15) self.msg.setWordWrap(True)#自动换行 self.msg.setAlignment(Qt.AlignTop)#靠上 self.msg.setStyleSheet("background-color:yellow;color:grey") #创建一个滚动对象 scroll=QScrollArea() scroll.setWidget(self.msg)#设置对msg进行滚动,因为原先msg(QLabel)大小只有(440,15) self.content_layout.addWidget(scroll)#垂直布局器添加自动滚动条(注:有滚动要配合布局器使用) btn=QPushButton("开始检测") btn.setGeometry(20,20,100,50) self.button_layout.addStretch() self.button_layout.addWidget(btn) self.button_layout.addStretch() btn.clicked.connect(self.detection) self.my_signal.connect(self.my_slot)#绑定信号与槽 self.container.addLayout(self.content_layout) self.container.addLayout(self.button_layout) self.setLayout(self.container) def my_slot(self,msg):#函数作用:将结果展示在屏幕上 #这里emit()一定要传一个参数 self.msg_lst.append(msg)#接受一个msg后保存结果(即将所有得到的msg存起来,便于后续展示) self.msg.setText("
".join(self.msg_lst))#设置msg(QLabel)内容 self.msg.resize(400,len(self.msg_lst)*15)#手动扩大:扩大msg(QLabel)大小,展示msg内容 self.msg.repaint()#更新内容,如果不更新可能没有显示新内容 def detection(self): print("开始检测:") for i in range(1,101): msg="192.168.0."+str(i) if i%5==0: msg=">>>" +msg self.my_signal.emit(msg)#发射信号(触发执行my_signal绑定的槽函数my_slot)。这里emit()一定要传一个参数 print("{}".format(msg)) if __name__ == "__main__": app = QApplication(sys.argv) win = MyWindow() win.show() app.exec()效果:
总结注意点:
展示文字QLabel() ——>要在屏幕上展示,布局大小不够时——>添加滚动对象QScrollArea()——>因滚动对象要配合布局器使用——>垂直布局器QVBoxLayout()
因此:布局器QVBoxLayout() 嵌套 滚动对象QScrollArea() 再嵌套 QLabel()
三、ui文件
纯代码编写界面效率低,可以用Qt Designer来辅助设计图形化界面
1、在Python中加载ui文件:
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5 import uic
if __name__=='__main__':
app=QApplication(sys.argv)
ui=uic.loadUi('./MainWindow.ui')
ui.show()
app.exec_()
2、ui文件转py文件:
终端在demo.ui目录下使用命令行:python -m PyQt5.uic.pyuic demo.ui -o demo.py
本篇为以下课程的学习笔记,仅做学习记录:
【PyQt5 快速入门】 https://www.bilibili.com/video/BV1LT4y1e72X/?p=33&share_source=copy_web&vd_source=4c701974d440a1de8021c328bad2ef26










