Appearance
PyQt基本UI
一、第一个PyQt程序
1. 程序源码
python
import sys
from PyQt5.QtWidgets import QApplication,QWidget
if __name__=='__main__':
app = QApplication(sys.argv)
w = QWidget() # 创建窗口对象
# 设置窗口标题
w.setWindowTitle('第一个PyQt程序')
# 展示窗口
w.show()
# 程序进入循环等待状态
app.exec_()
2. 源码讲解
3. 关于Python中的sys.argv
sys.argv
是 Python 中用于获取命令行参数的一个列表,它是 sys
模块的一个重要属性。
基本概念
- 定义:
sys.argv
是一个包含命令行参数的列表 - 作用:让 Python 脚本能够接收并处理从命令行传入的参数
- 模块:需要先导入
sys
模块才能使用
列表内容
sys.argv
列表包含以下元素:
sys.argv[0]
:脚本名称(第一个元素总是脚本本身的名称)sys.argv[1]
:第一个命令行参数sys.argv[2]
:第二个命令行参数- 以此类推...
基本用法示例
python
import sys
print("脚本名称:", sys.argv[0])
print("参数个数:", len(sys.argv) - 1)
print("参数列表:", sys.argv[1:])
实际应用示例
示例1:简单参数传递
python
# test.py
import sys
if len(sys.argv) > 1:
print(f"Hello, {sys.argv[1]}!")
else:
print("Hello, World!")
- 直接运行
输出:
shell
Hello, World!
- 加上参数后运行
python
python test.py Alice
输出:
shell
Hello, Alice!
示例2:计算器功能
python
# test.py
import sys
if len(sys.argv) != 4:
print("用法: python test.py <数字1> <操作符> <数字2>")
sys.exit(1)
num1 = float(sys.argv[1])
op = sys.argv[2]
num2 = float(sys.argv[3])
if op == '+':
result = num1 + num2
elif op == '-':
result = num1 - num2
elif op == '*':
result = num1 * num2
elif op == '/':
if num2 == 0:
print("除数不能为0!")
sys.exit(1)
result = num1 / num2
else:
print("无效的操作符")
sys.exit(1)
print(f"结果: {result}")
运行方式:
shell
python test.py 5 '*' 3
输出:
shell
结果: 15.0
注意事项
- 参数类型:所有参数都以字符串形式传入,需要根据需要进行类型转换
- 参数检查:使用前应先检查参数数量和格式
- 错误处理:对于用户输入要做好异常处理
- 索引错误:访问不存在的索引会引发
IndexError
- 模块导入:必须首先
import sys
二、模块介绍
1. 常用模块
PyQt中有非常多的功能模块,开发中最常用的功能模块主要有三个
- QtCore:包含了核心的非GUI的功能,主要和时间、文件和文件夹、各种数据、流、URLs、mime类文件、进程与线程一起使用
- QtGui:包含了窗口系统、事件处理、2D图像、基本绘画、字体和文件类
- QtWidgets:包含了一系列创建桌面应用程序的UI元素
2. 学习方式
需要什么功能就去查阅与它相关的api或者查阅别人分享的心得,这是学习最快的方式
三、基本UI
窗口内的所有控件,若想在窗口中显示,都需要表示它的父亲是谁,而不能直接使用
show
函数显示
1. 按钮
- 按钮对应的控件名称为
QPushButton
,位于PyQt5.QtWidgets
里面
程序源码
python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
if __name__=='__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle('第一个PyQt程序')
# 在窗口里面添加控件
# 按钮
btn = QPushButton("按钮")
# 设置按钮的父类是当前窗口,等于添加按钮到窗口中显示
btn.setParent(w)
# 展示窗口
w.show()
# 程序进入循环等待状态
app.exec_()
源码讲解
2. 标签
- 标签控件名称为
QLabel
,位于PyQt5.QtWidgets
里面 - 标签控件仅仅作为标识显示而已,类似输入内容前的一段提示(账号、密码)
程序源码
python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
if __name__=='__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle('第一个PyQt程序')
# 在窗口里面添加控件
# 标签
label = QLabel("账号:")
# 设置父对象
label.setParent(w)
# 展示窗口
w.show()
# 程序进入循环等待状态
app.exec_()
源码讲解
3. 输入框
- 输入框的控件名为
QLineEdit
,位于PyQt5.QWidgets
里面
程序源码
python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit
if __name__=='__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle('第一个PyQt程序')
# 文本框
edit = QLineEdit()
edit.setPlaceholderText("请输入账号")
edit.setParent(w)
# 展示窗口
w.show()
# 程序进入循环等待状态
app.exec_()
源码讲解
优化说明
- 可以在创建控件的时候就进行父类绑定
程序源码
python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit
if __name__=='__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle('第一个PyQt程序')
# 在窗口里面添加控件
# 文本框
label = QLineEdit(w)
label.setPlaceholderText("请输入账号")
# 设置位置与大小(x,y,w,h)
label.setGeometry(20,20,400,20)
# 展示窗口
w.show()
# 程序进入循环等待状态
app.exec_()
源码讲解
整体基础实战
- 做一个简单的注册GUI
程序源码
python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton
if __name__=='__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle('第一个PyQt程序')
# 在窗口里面添加控件
# 标签
label = QLabel("账号:",w)
label.setGeometry(20,20,40,20)
# 文本框
edit = QLineEdit(w)
edit.setPlaceholderText("请输入账号")
edit.setGeometry(65,20,300,20)
# 按钮
btn = QPushButton("注册",w)
btn.setGeometry(182,60,40,25)
# 展示窗口
w.show()
# 程序进入循环等待状态
app.exec_()
源码讲解
四、窗口
1. 窗口大小调整
程序源码
python
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__=='__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle('第一个PyQt程序')
# 窗口大小设置(w,h)
w.resize(400,300)
# 展示窗口
w.show()
# 程序进入循环等待状态
app.exec_()
源码讲解
2. 窗口位置调整
将窗口放置到某个坐标
注意:是将窗口的开始位置作为移动的坐标
程序源码
python
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__=='__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle('第一个PyQt程序')
# 窗口大小设置(w,h)
w.resize(400,300)
# 将窗口放置到某个坐标(x,y),如放置到左上角
w.move(0,0)
# 展示窗口
w.show()
# 程序进入循环等待状态
app.exec_()
源码讲解
将窗口放置到中央位置
- 基础版(窗口大小变动的话,计算数值需要手动跟着变动)
程序源码
python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget
if __name__=='__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle('第一个PyQt程序')
# 窗口大小设置(w,h)
w.resize(400,300)
# 调整窗口在屏幕中央显示
center_pointer = QDesktopWidget().availableGeometry().center()
# print(center_pointer)
# PyQt5.QtCore.QPoint(959, 509)
x = center_pointer.x()
y = center_pointer.y()
x = x - 200
y = y - 150
# 移动窗口至得到的中央坐标
w.move(x,y)
# 展示窗口
w.show()
# 程序进入循环等待状态
app.exec_()
源码讲解
- 进阶版(窗口大小变动的话,计算数值会自动跟着变动)
程序源码
python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget
if __name__=='__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle('第一个PyQt程序')
# 窗口大小设置(w,h)
w.resize(400,300)
# 获取可用屏幕中央坐标
center_pointer = QDesktopWidget().availableGeometry().center()
x = center_pointer.x()
y = center_pointer.y()
# print(w.frameGeometry())
# PyQt5.QtCore.QRect(0, 0, 400, 300)
# 打印窗口的位置及大小(x,y,w,h),但是(x,y)如果没有设置过或者使用move移动过,
# 值都会默认识别为(0,0),尽管我们肉眼看到它根本就没在(0,0)坐标上,可能是PyQt的bug
# print(w.frameGeometry().getRect())
# (0, 0, 400, 300)
# 获取窗口位置及大小数据的元组
# print(type(w.frameGeometry().getRect()))
# <class 'tuple'>
# 解包提取窗口的位置及大小数据元组
x_old , y_old , w_old , h_old = w.frameGeometry().getRect()
# print(x_old,y_old,w_old,h_old)
# 0 0 400 300
x = x - w_old/2
y = y - h_old/2
# 展示窗口
w.show()
# 程序进入循环等待状态
app.exec_()
源码讲解
3. 设置窗口的图标
图标获取途径
程序源码
python
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget
if __name__=='__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle('第一个PyQt程序')
# 设置窗口图标
w.setWindowIcon(QIcon('logo.ico'))
# 展示窗口
w.show()
# 程序进入循环等待状态
app.exec_()
源码讲解
4. 隐藏窗口标题栏
注意:默认的标题栏较为简陋,一般在实际开发中为满足更为多功能、更为美观的"标题栏",一般选择将默认标题栏进行隐藏,由开发者自行构造自己较为满意的标题栏及功能
程序源码
python
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import Qt
if __name__=='__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标志,隐藏标题栏
w.setWindowFlags(Qt.FramelessWindowHint)
# 展示窗口
w.show()
# 程序进入循环等待状态
app.exec_()
运行结果展示
源码讲解