【python】PyQt5 学习 _3
前面发的帖子http://support.i-search.com.cn/article/1565059787780里出现了一个新概念 “布局”。今天就要专门讲解啦。
绝对定位
程序指定每个控件的位置和大小 (以像素为单位)。
绝对定位有以下限制:
- 如果我们调整窗口,控件的大小和位置不会改变
- 在各种平台上应用程序看起来会不一样
- 如果改变字体,我们的应用程序的布局就会改变
- 如果布局要改变,则必须全部重做。
下面的例子显示了一个绝对定位
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QWidget, QLabel, QApplication
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lbl1 = QLabel('Zetcode', self)
lbl1.move(15, 10)
lbl2 = QLabel('tutorials', self)
lbl2.move(35, 40)
lbl3 = QLabel('for programmers', self)
lbl3.move(55, 70)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Absolute')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
我们使用 move() 方法来控制控件的位置。
效果 如下图:
这种布局方式 非常直接简单,有好处,也有缺点。如果你不想折腾,这样就很好。。。
框布局 Boxlayout
QHBoxLayout 创建 横向布局。
QVBoxLayout 创建 纵向布局。
import sys
from PyQt5.QtWidgets import (QWidget, QPushButton,
QHBoxLayout, QVBoxLayout, QApplication)
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
okButton = QPushButton("OK")
cancelButton = QPushButton("Cancel")
hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(okButton)
hbox.addWidget(cancelButton)
vbox = QVBoxLayout()
vbox.addStretch(1)
vbox.addLayout(hbox)
self.setLayout(vbox)
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle('Buttons')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
效果如下图:
框布局应该是正常编程中使用率较多的布局方式。随心所欲,变化万端。
本例中的 OK、Cancel 按键 没有关联相关方法,所以点击没有反应。以后会进一步讲解。
表格布局 QGridLayout 也被称作网格布局(多行多列)
表格布局将空间划分为行和列。我们使用 QGridLayout 类创建一个网格布局。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton
class QT(QWidget):
def __init__(self,parent=None):
super(Winform,self).__init__(parent)
self.initUI()
def initUI(self):
grid = QGridLayout() # 创建QGridLayout的实例,并设置窗口的布局
self.setLayout(grid)
#2创建按钮的标签列表
names = ['Cls', 'Back', '', 'Close',
'7', '8', '9', '/',
'4', '5', '6', '*',
'1', '2', '3', '-',
'0', '.', '=', '+']
positions = [(i,j) for i in range(5) for j in range(4)] # 在网格中创建一个位置列表
# 创建按钮并通过addWIdget()方法添加到布局中
for position, name in zip(positions, names):
if name == '':
continue
button = QPushButton(name)
grid.addWidget(button, *position)
self.move(300, 150)
self.setWindowTitle('网格布局管理例子')
if __name__ == "__main__":
app = QApplication(sys.argv)
form = QT()
form.show()
sys.exit(app.exec_())
表格布局井然有序,安然稳重。
NOTE:
1.GUI 编程的本质 :想象你是一名画师,面前是一张画布,尽情抒发情感。
2. 本帖也只是简单介绍 3 种布局方式,每种方式 以后也会具体讲解 ~~~
3. 最后祝大家节日快乐呀 😘
这都怎么学习的?做的这么好
:竖起大拇指: