Eric6与pyqt5学习笔记 2【页面基本布局】

时间:2022-01-28 03:41:21

0X01.图形化拖拽生成最基本图形化界面

    之前配置了学习环境,现在来正式学习吧,为了便于理解,首先推荐大家去使用图形化界面拖拽生成一个,这里推荐一个博主的博客,点这里,先去熟悉一下基本用法

0x02.正式了解pyqt5代码

    参考了各种资料,从最基础的开始入门吧,

1.生成一个窗口

# -*- coding:utf-8 -*- 
'''
@Author: GETF
@Email: GETF_own@163.com
@DateTime: 2017-10-26 15:11:04
@Description: Description
'''

# Form implementation generated from reading ui file 'F:\pythonexe\hello\hello.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!



import sys
#这里我们提供必要的引用。基本控件位于pyqt5.qtwidgets模块中。
from PyQt5.QtWidgets import QApplication, QWidget


if __name__ == '__main__':
#每一pyqt5应用程序必须创建一个应用程序对象。sys.argv参数是一个列表,从命令行输入参数。
app = QApplication(sys.argv)
#QWidget部件是pyqt5所有用户界面对象的基类。他为QWidget提供默认构造函数。默认构造函数没有父类。
w = QWidget()
#resize()方法调整窗口的大小。这离是250px宽150px高
w.resize(250, 150)
#move()方法移动窗口在屏幕上的位置到x = 300,y = 300坐标。
w.move(300, 300)
#设置窗口的标题
w.setWindowTitle('Simple')
#显示在屏幕上
w.show()

#系统exit()方法确保应用程序干净的退出
#的exec_()方法有下划线。因为执行是一个Python关键词。因此,exec_()代替
sys.exit(app.exec_())
用Eric6运行生成一个窗口,不截图了,空白窗口,,,


2.整合函数,设置图标

代码如下:

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
import os


class Example(QWidget):

def __init__(self):
super().__init__()
'''
这是对继承自父类的属性进行初始化。而且是用父类的初始化方法来初始化继承的属性。
也就是说,子类继承了父类的所有属性和方法,父类属性自然会用父类方法来进行初始化。
当然,如果初始化的逻辑与父类的不同,不使用父类的方法,自己重新初始化也是可以的。
'''
self.initUI() #界面绘制交给InitUi方法


def initUI(self):
#设置窗口的位置和大小
self.setGeometry(300, 300, 300, 220)
#设置窗口的标题
#self.setWindowTitle('Icon')
#设置窗口的图标,引用该路径目录下的favicon.ico图片
#self.setWindowIcon(QIcon('F:\\pythonexe\\hello\\image\\favicon.ico'))
#感觉上面太麻烦了,路径还要自己找,使用os直接从当前目录出发
dir_path = os.path.abspath(os.path.dirname(__file__))+'\image\\favicon.ico'
#注意,\f有特殊定义,所以用反斜杠转义
self.setWindowIcon(QIcon(dir_path))
self.setWindowTitle(dir_path)
#显示窗口
self.show()


if __name__ == '__main__':
#创建应用程序和对象
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

测试的截图如下:

Eric6与pyqt5学习笔记 2【页面基本布局】

Eric6与pyqt5学习笔记 2【页面基本布局】

title被我设置成了标题,方便测试,另附一下我的目录树

Eric6与pyqt5学习笔记 2【页面基本布局】


注意一个点:

print os.getcwd()
print os.path.abspath(os.path.dirname(__file__))

按道理这两个获取当前目录应该是一样的,但os.getcwd()获取到的是我python3.5的目录,

google查询了一波,差不多弄懂了原因,解释如下:

Eric6与pyqt5学习笔记 2【页面基本布局】

回答链接点这里

其实和我理解的差不多吧,一个是绝对路径,一个是工作路径,恩,换句话来说,你当前的脚本可能编译后运行的目录和脚本目录不一样



3.增加按钮,悬停注释

# -*- coding:utf-8 -*- 
'''
@Author: GETF
@Email: GETF_own@163.com
@DateTime: 2017-10-26 15:11:04
@Description: Description
'''

# Form implementation generated from reading ui file 'F:\pythonexe\hello\hello.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!


import sys
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QToolTip
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QIcon
from PyQt5.QtGui import QFont
import os


class Example(QWidget):

def __init__(self):
super().__init__()
'''
这是对继承自父类的属性进行初始化。而且是用父类的初始化方法来初始化继承的属性。
也就是说,子类继承了父类的所有属性和方法,父类属性自然会用父类方法来进行初始化。
当然,如果初始化的逻辑与父类的不同,不使用父类的方法,自己重新初始化也是可以的。
'''
self.initUI() #界面绘制交给InitUi方法


def initUI(self):
#这种静态的方法设置一个用于显示工具提示的字体。我们使用10px楷体字体。
QToolTip.setFont(QFont('楷体', 10))
#创建一个PushButton并为他设置一个tooltip
btn = QPushButton('Button', self)
#创建一个提示,我们称之为settooltip()方法。我们可以使用丰富的文本格式
btn.setToolTip('Warning! boom~')
#btn.sizeHint()显示默认尺寸
btn.resize(btn.sizeHint())
#移动窗口的位置
btn.move(100, 100)

self.setGeometry(300, 300, 300, 220)
dir_path = os.path.abspath(os.path.dirname(__file__))+'\image\\favicon.ico'
self.setWindowIcon(QIcon(dir_path))
self.setWindowTitle('Hello')
self.show()



if __name__ == '__main__':
#创建应用程序和对象
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())


效果图如下:Eric6与pyqt5学习笔记 2【页面基本布局】


这里补充一个关于字体设置的博客:点击这里,自行学习吧


4.窗口屏幕中间显示

还记得第一段代码么?

w = QWidget()
#resize()方法调整窗口的大小。这离是250px宽150px高
w.resize(250, 150)
#move()方法移动窗口在屏幕上的位置到x = 300,y = 300坐标。
w.move(300, 300)
#设置窗口的标题
w.setWindowTitle('Simple')
#显示在屏幕上
w.show()
后面的代码中,我们将resize和move混合起来使用了内置提供的setGeometry() 函数,但有没有感觉这种靠像素来移动位置很烦躁,根据常规习惯,窗口在屏幕中心刚刚好,那我们怎么设置呢?请看下面代码:
# -*- coding:utf-8 -*- ''' @Author:      GETF @Email:       GETF_own@163.com @DateTime:    2017-10-26 15:11:04 @Description: Description '''# Form implementation generated from reading ui file 'F:\pythonexe\hello\hello.ui'## Created by: PyQt5 UI code generator 5.6## WARNING! All changes made in this file will be lost!import sysfrom PyQt5.QtWidgets import QWidgetfrom PyQt5.QtWidgets import QToolTipfrom PyQt5.QtWidgets import QPushButtonfrom PyQt5.QtWidgets import QApplicationfrom PyQt5.QtWidgets import QDesktopWidgetfrom PyQt5.QtGui import QIconfrom PyQt5.QtGui import QFontimport os  class Example(QWidget):        def __init__(self):        super().__init__()        '''        这是对继承自父类的属性进行初始化。而且是用父类的初始化方法来初始化继承的属性。        也就是说,子类继承了父类的所有属性和方法,父类属性自然会用父类方法来进行初始化。        当然,如果初始化的逻辑与父类的不同,不使用父类的方法,自己重新初始化也是可以的。        '''        self.initUI() #界面绘制交给InitUi方法                    def initUI(self):        #这种静态的方法设置一个用于显示工具提示的字体。我们使用10px楷体字体。        QToolTip.setFont(QFont('楷体', 10))        #创建一个PushButton并为他设置一个tooltip        btn = QPushButton('Button', self)        #创建一个提示,我们称之为settooltip()方法。我们可以使用丰富的文本格式        btn.setToolTip('Warning! boom~')        #btn.sizeHint()显示默认尺寸        btn.resize(btn.sizeHint())        #移动窗口的位置        btn.move(100, 100)         #获得窗口        qr = self.frameGeometry()        #获得屏幕中心点        cp = QDesktopWidget().availableGeometry().center()        #显示到屏幕中心        qr.moveCenter(cp)        self.move(qr.topLeft())        '''上述四行课直接调用下面函数slef.center()代替'''        dir_path = os.path.abspath(os.path.dirname(__file__))+'\image\\favicon.ico'        self.setWindowIcon(QIcon(dir_path))        self.setWindowTitle('Hello')        self.show()        '''        #控制窗口显示在屏幕中心的方法,为了使用方便这里将其封装成函数        def center(self):            qr = self.frameGeometry()            cp = QDesktopWidget().availableGeometry().center()            qr.moveCenter(cp)            self.move(qr.topLeft())        '''if __name__ == '__main__':    #创建应用程序和对象    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_()) 


5.退出提示,提示信息类QMessageBox

首先放代码:

# -*- coding:utf-8 -*- 
'''
@Author: GETF
@Email: GETF_own@163.com
@DateTime: 2017-10-27 13:41:21
@Description: Description
'''


# Form implementation generated from reading ui file 'F:\pythonexe\hello\hello.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!


import sys
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QToolTip
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QDesktopWidget
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtGui import QIcon
from PyQt5.QtGui import QFont
import os


class Example(QWidget):

def __init__(self):
super().__init__()
self.initUI()

def center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())


def initUI(self):
QToolTip.setFont(QFont('楷体', 10))
btn = QPushButton('Button', self)
btn.setToolTip('Warning! boom~')
btn.resize(btn.sizeHint())
btn.move(100, 100)

#获得窗口
self.center()

dir_path = os.path.abspath(os.path.dirname(__file__))+'\image\\favicon.ico'
self.setWindowIcon(QIcon(dir_path))
self.setWindowTitle('Hello')
self.show()

def closeEvent(self, event):#当我们关闭窗口,即点击右上角的x按钮时,触发该事件
reply = QMessageBox.question(self, '提示',"是否确认退出?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
#使用QMessageBox类进行消息提示
#self之后的参数依次为提示框标题,提示内容,两个按钮,默认按钮

if reply == QMessageBox.Yes:#这里对接收到的结果进行处理
event.accept()
else:
event.ignore()




if __name__ == '__main__':
#创建应用程序和对象
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

效果图如下:

Eric6与pyqt5学习笔记 2【页面基本布局】

划重点:QMessageBox类提供了各种形式的信息提示框,

ummmm博主没找到资料关于修改提示信息,yes和no的内容,以后补吧~


这里列举一些:

QMessageBox.information 信息框
QMessageBox.question 问答框
QMessageBox.warning 警告
QMessageBox.ctitical危险
QMessageBox.about 关于

这里写个按钮挨个测试下,代码如下:

# -*- coding:utf-8 -*- 
'''
@Author: GETF
@Email: GETF_own@163.com
@DateTime: 2017-10-27 13:41:21
@Description: Description
'''


# Form implementation generated from reading ui file 'F:\pythonexe\hello\hello.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!


import sys
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QToolTip
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QDesktopWidget
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtGui import QIcon
from PyQt5.QtGui import QFont
import os


class Example(QWidget):

def __init__(self):
super().__init__()
self.initUI()

def center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())


def initUI(self):
QToolTip.setFont(QFont('楷体', 10))
btn = QPushButton('点我点我', self)

# btn.clicked.connect(self.select_question)#将按钮绑定
# btn.clicked.connect(self.select_information)
# btn.clicked.connect(self.select_warning)
# btn.clicked.connect(self.select_ctiticel)
btn.clicked.connect(self.select_about)

btn.setToolTip('Warning! boom~')
btn.resize(btn.sizeHint())
btn.move(100, 100)
#使用QMessageBox类进行消息提示
#self之后的参数依次为提示框标题,提示内容,两个按钮,默认按钮



#获得窗口
self.center()

dir_path = os.path.abspath(os.path.dirname(__file__))+'\image\\favicon.ico'
self.setWindowIcon(QIcon(dir_path))
self.setWindowTitle('Hello')
self.show()

def select_question(self):
reply = QMessageBox.question(self, '提示',"是否确认退出?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:#这里对接收到的结果进行处理
self.close()
else:
self.close()

def select_information(self):
reply = QMessageBox.question(self, '通知',"版本更新", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:#这里对接收到的结果进行处理
self.close()
else:
self.close()

def select_warning(self):
reply = QMessageBox.question(self, '警告',"打雷了,下雨了,回家收衣服了", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:#这里对接收到的结果进行处理
self.close()
else:
self.close()

def select_ctitical(self):
reply = QMessageBox.question(self, '危险',"硬盘新闻联播已删除!", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:#这里对接收到的结果进行处理
self.close()
else:
self.close()

def select_about(self):
reply = QMessageBox.question(self, '关于',"版本:1.0.0", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:#这里对接收到的结果进行处理
self.close()
else:
self.close()



if __name__ == '__main__':
#创建应用程序和对象
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())


测试效果图:

Eric6与pyqt5学习笔记 2【页面基本布局】

Eric6与pyqt5学习笔记 2【页面基本布局】

Eric6与pyqt5学习笔记 2【页面基本布局】

Eric6与pyqt5学习笔记 2【页面基本布局】


总结下,感觉没啥区别,或许目前只是个新手吧,以后感觉到区别再回来改~


附一个提示框这个类的学习博客,点这里