赞
踩
不辜负每个朝阳,不荒废每个深夜,因平凡而奋斗,因奋斗而不平凡。
————夜色的繁星
指路明灯强烈推荐链接:https://blog.csdn.net/La_vie_est_belle/article/details/82316745
目录
- import sys
- from PyQt5.QtWidgets import QApplication,QLabel#QLabel是文本控件
-
- #接着我们编写程序入口处代码
- if __name__ == "__main__":
- app = QApplication(sys.argv)#传入sys.argv参数用于构造
- label = QLabel("Hello Word")#实例化一个QLabel文本控件
- #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
- label.show()
- sys.exit(app.exec_())
- '''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
- 作为参数给sys.exit()接着就可以正常退出python程序'''
为了让大家能够更直观的看到app对象的exec方法(app.exec())所返回的值,我这里把代码稍微修改一下,
- import sys
- from PyQt5.QtWidgets import QApplication,QLabel#QLabel是文本控件
-
- #接着我们编写程序入口处代码
- if __name__ == "__main__":
- app = QApplication(sys.argv)#传入sys.argv参数用于构造
- label = QLabel("Hello Word")#实例化一个QLabel文本控件
- #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
- label.show()
- #修改了下面几行
- a = app.exec_()
- print(a)
- sys.exit(a)
- '''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
- 作为参数给sys.exit()接着就可以正常退出python程序'''
修改完后发现返回值为零。此时a作为参数传递给了sys.exit()表示正常退出python程序
大家可能会有这个疑问为什么,app.exec_为什么会有下划线,那是因为在python2版本中exec是个关键字,为了避免冲突,
pyqt5就在自己的方法中加了下划线,因为现在使用的是python3版本了所以不加下滑先也不会有任何冲突
你可以自行查一下python的关键字:
python2查询:
输入:
help("keywords")
python3查询:
输入:
help("keywords")
通过查询我们发现python3中的exec不在是关键字
除了在构造的时候直接传入文本字符串:
label = QLabel("Hello Word")#实例化一个QLabel文本控件
我们还可以通过调用label对象的setText()的方法来设置文本
label.setText("hello word")
优点是可以在字符串当中添加Html代码来改变文本样式非常方便:
label.setText('<font color = "red">hello word</font>')
按钮控件要用到QpushButton
需要导入QpushButton
下面这种方法是直接在btn = QPushButton()中直接传入文本字符串来实例化
- import sys
- from PyQt5.QtWidgets import QApplication,QPushButton#这里导入了一个按钮控件
-
- #接着我们编写程序入口处代码
- if __name__ == "__main__":
- app = QApplication(sys.argv)#传入sys.argv参数用于构造
- btn = QPushButton("Button")#直接传入文本字符串来实例化
- #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
- btn.show()
- sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
- '''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
- 作为参数给sys.exit()接着就可以正常退出python程序'''
下面是调用按钮控件的利用setText()函数来设置文本
- import sys
- from PyQt5.QtWidgets import QApplication,QPushButton#这里导入了一个按钮控件
-
- #接着我们编写程序入口处代码
- if __name__ == "__main__":
- app = QApplication(sys.argv)#传入sys.argv参数用于构造
- btn = QPushButton()
- btn.setText("Button")#利用setText()函数来设置文本
-
- #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
- btn.show()
- sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
- '''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
- 作为参数给sys.exit()接着就可以正常退出python程序'''
当然一个pyqt5的项目的代码不可能全部都挤在这个程序入口中,而且之后要用到的控件肯定不止一个,如果直接实例化多个空间的话,就会出现多个窗口:
例如下面我在给大家实例化一个Qlabel:
- import sys
- from PyQt5.QtWidgets import QApplication,QPushButton,QLabel#这里导入了一个按钮控件
-
- #接着我们编写程序入口处代码
- if __name__ == "__main__":
- app = QApplication(sys.argv)#传入sys.argv参数用于构造
- btn = QPushButton()
- btn.setText("Button")#利用setText()函数来设置文本
- label = QLabel()
- label.setText("Button") # 利用setText()函数来设置文本
-
- #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
- btn.show()
- label.show()
- sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
- '''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
- 作为参数给sys.exit()接着就可以正常退出python程序'''
我们需要的是把多个控件放在一个窗口当中,为了完成这样的要求同时为了让代码比较美观,更好管理我们通常会写一个类
先放一个Qlabel控件:
- import sys
- from PyQt5.QtWidgets import QApplication,QLabel,QWidget#这里导入了一个按钮控件
-
-
- class Demo(QWidget): #让我们自定义这个类继承QWidget,可以当做是一个空白窗口
- def __init__(self):
- super(Demo,self).__init__()#对继承自父类的属性进行初始化
- self.label = QLabel("Label",self)#第一个参数是指定的文本,第二个参数是指定的父类DemoQLabel函数
- #是存在和属于于Demo()窗口上的
- #接着我们编写程序入口处代码
- if __name__ == "__main__":
- app = QApplication(sys.argv)#传入sys.argv参数用于构造
- a=Demo()
- a.show()
-
- #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
-
- sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
- '''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
- 作为参数给sys.exit()接着就可以正常退出python程
再加上一个按钮控件:
- import sys
- from PyQt5.QtWidgets import QApplication,QLabel,QWidget,QPushButton#这里导入了一个按钮控件
-
-
- class Demo(QWidget): #让我们自定义这个类继承QWidget,可以当做是一个空白窗口
- def __init__(self):
- super(Demo,self).__init__()
- self.label = QLabel("Label",self)#第一个参数是指定的文本,第二个参数是指定的父类DemoQLabel函数
- self.btn = QPushButton("按钮",self)
- #是存在和属于于Demo()窗口上的
- #接着我们编写程序入口处代码
- if __name__ == "__main__":
- app = QApplication(sys.argv)#传入sys.argv参数用于构造
- a=Demo()
- a.show()
-
- #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
-
- sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
- '''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
- 作为参数给sys.exit()接着就可以正常退出python程序'''
运行完以后发现文本控件和按钮控件重叠了:
因为各个控件默认都是显示在窗口的左上角,所以要用布局管理器进行布局
最简单的布局管理就是调用move(x,y)方法来规定各个控件在窗口上的位置,不管是窗口还是控件他们的坐标原点都在左上角,向右为x轴正方向,向下为y轴正方向。
- import sys
- from PyQt5.QtWidgets import QApplication,QLabel,QWidget,QPushButton#这里导入了一个按钮控件
-
-
- class Demo(QWidget): #让我们自定义这个类继承QWidget,可以当做是一个空白窗口
- def __init__(self):
- super(Demo,self).__init__()
- self.resize(600, 600) # 设置窗口长宽都为600
-
- self.label = QLabel("Label",self)#第一个参数是指定的文本,第二个参数是指定的父类DemoQLabel函数
- self.btn = QPushButton("按钮",self)
-
- self.label.move(-20, 50)#用-20测试一下文本是否会被遮挡
- self.btn.move(50,100)
- #是存在和属于于Demo()窗口上的
- #接着我们编写程序入口处代码
- if __name__ == "__main__":
- app = QApplication(sys.argv)#传入sys.argv参数用于构造
- a=Demo()
- a.show()
-
- #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
-
- sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
- """此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
- 作为参数给sys.exit()接着就可以正常退出python"""
用move可以很快的进行布局,但是当控件的数量很多的话,用这个就不在方便了,因为我们要计算很多的坐标,如果我们放大控件的话,控件不会自适应,他们还是老老实实的呆在指定坐标。为了改变这个问题,就要用到pyqt5中的布局管理器了
1.垂直布局
所谓垂直布局就是从上到下垂直进行摆放,用到了QVBoxLayout的模块
- import sys
- from PyQt5.QtWidgets import QApplication,QLabel,QWidget,QVBoxLayout#导入了垂直布局模块
-
-
- class Demo(QWidget): #让我们自定义这个类继承QWidget,可以当做是一个空白窗口
- def __init__(self):
- super(Demo,self).__init__()
- self.user_label = QLabel("Username:",self)
- self.pwd_label = QLabel("Password:",self)
-
- #实例化一个垂直布局管理器
- self.v_layout = QVBoxLayout()
- self.v_layout.addWidget(self.user_label)
- self.v_layout.addWidget(self.pwd_label)
- #最后调用上方的layout方法来将上方的垂直布局设置为窗口的整体布局
- self.setLayout(self.v_layout)
- #接着我们编写程序入口处代码
- if __name__ == "__main__":
- app = QApplication(sys.argv)#传入sys.argv参数用于构造
- a=Demo()
- a.show()
-
- #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
-
- sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
- '''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
- 作为参数给sys.exit()接着就可以正常退出python程序'''
2.水平布局
所谓水平布局就是从左到右水平依次摆放,用到了QH oxLayout的模块
- import sys
- from PyQt5.QtWidgets import QApplication,QLabel,QWidget,QHBoxLayout,QLineEdit#这个空间是当行文本输入框
-
-
- class Demo(QWidget): #让我们自定义这个类继承QWidget,可以当做是一个空白窗口
- def __init__(self):
- super(Demo, self).__init__()
- self.user_label = QLabel('Username:', self)
- self.user_line = QLineEdit(self) # 1#为了更清楚的理解变量名,通常要写的很直白,这个空间是文本输入框
-
- self.h_layout = QHBoxLayout() # 2
- self.h_layout.addWidget(self.user_label) # 3#先添加的控件位置在左
- self.h_layout.addWidget(self.user_line) # 4
-
- #将上面的水平布局设置为窗口的整体布局
- self.setLayout(self.h_layout) # 5
- #接着我们编写程序入口处代码
- if __name__ == "__main__":
- app = QApplication(sys.argv)#传入sys.argv参数用于构造
- a=Demo()
- a.show()
-
- #因为窗口和控件默认是隐藏的,所以我们要调用show()来进行显示
-
- sys.exit(app.exec())#此时a作为参数传递给了sys.exit()表示正常退出python程序
- '''此时就会进入pyqt5的主循环了,当窗口关闭的时候,app.exec_()这个方法就会返回一个0,
- 作为参数给sys.exit()接着就可以正常退出python程序'''
3.嵌套布局
- 添加控件用addWidget
- 添加布局的话用addLayout
- import sys
- from PyQt5.QtWidgets import QApplication,QLabel,QLineEdit,QWidget,QHBoxLayout,QVBoxLayout#导入了一个文本输入框
- class Demo(QWidget):
- def __init__(self):#初始化父类属性
- super(Demo,self).__init__()#初始化父类属性
-
- self.yonghu_label = QLabel("用户:",self)
- self.mima_label = QLabel("密码:",self)
- self.yonghu_line = QLineEdit(self)
- self.mima_line = QLineEdit(self)
-
- self.h1_layout = QHBoxLayout()#水平布局
- self.h2_layout = QHBoxLayout()#水平布局
- self.v_layout = QVBoxLayout()#垂直布局
- self.h1_layout.addWidget(self.yonghu_label)
- self.h1_layout.addWidget(self.yonghu_line)
- self.h2_layout.addWidget(self.mima_label)#添加控件用addWidget
- self.h2_layout.addWidget(self.mima_line)
- self.v_layout.addLayout(self.h1_layout)#添加布局的话用addLayout
- self.v_layout.addLayout(self.h2_layout)
-
- self.setLayout(self.v_layout)
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- a=Demo()
- a.show()
- sys.exit(app.exec())
-
4.表单布局
表单布局通常用来设置文本型控件和输入型部件布局
- import sys
- from PyQt5.QtWidgets import QApplication,QLabel,QLineEdit,QWidget,QFormLayout#导入了一个文本输入框
- class Demo(QWidget):
- def __init__(self):#初始化父类属性
- super(Demo,self).__init__()#初始化父类属性
- self.user_label = QLabel("Username",self)
- self.pwd_label = QLabel("Password",self)
- self.user_line = QLineEdit(self)
- self.pwd_line = QLineEdit(self)
-
- self.f_layout = QFormLayout() #实例化一个QFormLayout对象,设置文本控件和输入型控件的
- self.f_layout.addRow(self.user_label,self.user_line)#左边放文本控件右边放输入型控件
- self.f_layout.addRow(self.pwd_label,self.pwd_line)
- self.setLayout(self.f_layout)
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- a=Demo()
- a.show()
- sys.exit(app.exec())
-
下面是按照上面的做一下修改
- import sys
- from PyQt5.QtWidgets import QApplication,QLabel,QLineEdit,QWidget,QFormLayout#导入了一个文本输入框
- class Demo(QWidget):
- def __init__(self):#初始化父类属性
- super(Demo,self).__init__()#初始化父类属性
- #self.user_label = QLabel("Username",self)#可以不用实例化文本控件,直接输入文本即可
- #self.pwd_label = QLabel("Password",self)
- self.user_line = QLineEdit(self)
- self.pwd_line = QLineEdit(self)
-
- self.f_layout = QFormLayout() #实例化一个QFormLayout对象,设置文本控件和输入型控件的
- self.f_layout.addRow("Username",self.user_line)#左边放文本控件右边放输入型控件
- self.f_layout.addRow("paddadeword",self.pwd_line)#根据上面那个程序修改,可以不用实例化控件,直接输入名称
- self.setLayout(self.f_layout)
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- a=Demo()
- a.show()
- sys.exit(app.exec())
-
5.表格布局
- import sys
- from PyQt5.QtWidgets import QApplication,QLabel,QLineEdit,QWidget,QGridLayout#导入了一个文本输入框
- class Demo(QWidget):
- def __init__(self):#初始化父类属性
- super(Demo,self).__init__()#初始化父类属性
- self.user_label = QLabel("Username",self)#可以不用实例化文本控件,直接输入文本即可
- self.pwd_label = QLabel("Password",self)
- self.user_line = QLineEdit(self)
- self.pwd_line = QLineEdit(self)
-
- self.g_layout = QGridLayout()#实例化一个网格布局
- self.g_layout.addWidget(self.user_label,0,0)#设置空间坐标位置
- self.g_layout.addWidget(self.user_line,0,1)
- self.g_layout.addWidget(self.pwd_label,1,0)
- self.g_layout.addWidget(self.pwd_line,1,1)
- self.setLayout(self.g_layout)#设置窗口最终布局
-
- self.setLayout(self.g_layout)
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- a=Demo()
- a.show()
- sys.exit(app.exec())
-
1.连接一个槽函数
作为pyqt5中各个对象之间的通信机制,可以说是最核心的知识点了,只有了解这个这个机制的用法才能写出功能完善的pyqt5
例如红绿灯:
rad --stop() 信号red,green
green--go() 槽函数:stop(),go ()
信号决定调用那个槽函数
不过信号和槽函数在连接之后才起作用
连接公式:
控件 信号 连接 槽函数
widget.signal.connect(slot)
经红绿灯代入公式:
traffic_light.red.connect(stop)
traffic_light.green.connect(go)
连接后信号发射然后启动
下面是一个按钮连接一个槽函数的代码,输出666,并将按钮控件名称修稿为Button
pyqt5中有一个按钮信号叫clicked汉语为点击的意思,这个信号在按钮被点击以后发射
- import sys
- from PyQt5.QtWidgets import QApplication,QLabel,QWidget,QVBoxLayout,QPushButton
- class Demo(QWidget):
- def __init__(self):#初始化父类属性
- super(Demo,self).__init__()#初始化父类属性
- self.label = QLabel("label",self)#创建一个文本控件
- self.btn = QPushButton("Button",self)#创建一个按钮控件
- self.btn.clicked.connect(self.change_text)#按钮工具的clicked信号和槽函数进行连接
-
- self.v_layout = QVBoxLayout()#创建
- self.v_layout.addWidget(self.label)
- self.v_layout.addWidget(self.btn)
- self.setLayout(self.v_layout)
- def change_text(self):#建立一个槽函数
- self.label.setText("Button")
- print(666)
-
-
-
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- a=Demo()
- a.show()
- sys.exit(app.exec())
-
2.连接多个槽函数
除了clicked信号,Qpushbotton还有pressed是按下的哪一刻发出的,而released是释放的那一刻发出的。
- import sys
- from PyQt5.QtWidgets import QApplication, QWidget,QLabel,QPushButton,QVBoxLayout
-
-
- class Demo(QWidget):
- def __init__(self):
- super(Demo, self).__init__()
- self.label = QLabel('Start', self)
- self.btn = QPushButton("Button",self)
- self.btn.clicked.connect(self.change_text)
- self.btn.clicked.connect(self.change_size)
-
- self.v_layout = QVBoxLayout()
- self.v_layout.addWidget(self.label)
- self.v_layout.addWidget(self.btn)
- self.setLayout(self.v_layout)
-
- def change_text(self):
-
- self.label.setText('Button')
- print(666)
-
- def change_size(self):
- self.resize(600,600)#将窗口设置成600*600
-
-
-
- if __name__ == '__main__':
- app = QApplication(sys.argv)
- demo = Demo()
- demo.show()
- sys.exit(app.exec_())
3.带参数的槽函数
- import sys
- from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout, QPushButton
-
-
- class Demo(QWidget):
- def __init__(self): # 初始化父类属性
- super(Demo, self).__init__() # 初始化父类属性
- self.label = QLabel("label", self) # 创建一个文本控件
- self.btn = QPushButton("Button", self) # 创建一个按钮控件
- self.btn.clicked.connect(lambda:self.change_text("Button")) # 按钮工具的clicked信号和槽函数进行连接
-
- self.v_layout = QVBoxLayout() # 创建
- self.v_layout.addWidget(self.label)
- self.v_layout.addWidget(self.btn)
- self.setLayout(self.v_layout)
-
- def change_text(self,text): # 建立一个槽函数
- self.label.setText(text)
- print(666)
-
-
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- a = Demo()
- a.show()
- sys.exit(app.exec())
-
1.消息框一般在运行过程中提示信息,以增加程序与用户的交互能力,在一定程度上减少了用户的失误率,比方说我们在编译文本时会出现一个提示框来是否要进行保存。
一共提供了以下文本:
虽然有那么多的消息框,但是使用方法是一样的。
接下来拿询问框做个示范。
父类 标题 内容 消息框的按钮
QMwssage.question(parent,title,content,button)#parent表示消息框所归属的程序窗口,通常会填写self,如果不属于任何程序窗口的话就填写None
举例子:
Qmessage.question.(None,"Question","do you wangt save it?",QMessageBox.Yes|QMessageBox.No)
除了yes和no,QMessageBox还为我们提供了以下按钮,
QMessageBox.Ok
QMessageBox.Close
QMessageBox.Cancel
QMessageBox.Open
QMessageBox.Save
注意不同的按钮只是显示不同的文本最后的功能还是我们自己来编写
程序如下:
- import sys
- from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout, QPushButton,QMessageBox
-
-
- class Demo(QWidget):
- def __init__(self): # 初始化父类属性
- super(Demo, self).__init__() # 初始化父类属性
- self.setWindowTitle("QMessageBox Text")
-
- self.btn1 = QPushButton("Question", self) # 创建一个按钮控件
- self.btn2 = QPushButton("Information",self)
- self.btn1.clicked.connect(lambda :self.show_msg_box(self.btn1))#因为槽函数带有参数,所以要用lambda
- self.btn2.clicked.connect(lambda :self.show_msg_box(self.btn2))
-
- self.v_layout = QVBoxLayout() # 创建
- self.v_layout.addWidget(self.btn1)
- self.v_layout.addWidget(self.btn2)
- self.setLayout(self.v_layout)
-
- def show_msg_box(self,btn): #设置一个参数通过参数来判断用户按下的是哪个按钮
- if btn == self.btn1:
- QMessageBox.question(self,"Question","Do you want to save it?",QMessageBox.Yes|QMessageBox.No)
- if btn == self.btn2:
- QMessageBox.information(self,"Information","This is a information message box",QMessageBox.Ok)
-
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- a = Demo()
- a.show()
- sys.exit(app.exec())
2.消息框可以判断是否保存:
- import sys
- from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout, QPushButton, QMessageBox
-
-
- class Demo(QWidget):
- def __init__(self): # 初始化父类属性
- super(Demo, self).__init__() # 初始化父类属性
- self.setWindowTitle("QMessageBox Text")#文本框标题
-
- self.btn1 = QPushButton("Question", self) # 创建一个按钮控件
- self.btn2 = QPushButton("Information", self)
- self.btn1.clicked.connect(lambda: self.show_msg_box(self.btn1)) # 因为槽函数带有参数,所以要用lambda
- self.btn2.clicked.connect(lambda: self.show_msg_box(self.btn2))
-
- self.v_layout = QVBoxLayout() # 创建垂直布局
- self.v_layout.addWidget(self.btn1)#将按钮控件添加到水平布局中
- self.v_layout.addWidget(self.btn2)
- self.setLayout(self.v_layout)#最后将上方的垂直布局设置为整体布局
-
- def show_msg_box(self, btn): # 设置一个参数通过参数来判断用户按下的是哪个按钮
- if btn == self.btn1:
- #定义一个按钮用来保存用户所选择的按钮
- choice = QMessageBox.question(self, "Question", "Do you want to save it?", QMessageBox.Yes | QMessageBox.No)
- if choice == QMessageBox.Yes:
- print("saved")
- self.close()#关闭窗口
- elif choice == QMessageBox.No:
- self.close()
-
- if btn == self.btn2:
- QMessageBox.information(self, "Information", "This is a information message box", QMessageBox.Ok)
-
-
- if __name__ == "__main__":
- app = QApplication(sys.argv)
- a = Demo()
- a.show()
- sys.exit(app.exec())
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。