python与上位机开发day04

模块和包、异常、PyQt5

一、模块和包

1.1 模块

  • Python中模块就是一个.py文件,模块中可以定义函数变量
  • 模块可以被其他模块引用
1.1.1 导入模块
"""
导入格式1:     import 模块名
使用格式:     模块名.函数  模块名.类名  模块名.变量名




"""
import utils

print(utils.name)
print(utils.sum(1, 3))
print(utils.Person("zhangsi", 18))
# 导入格式2:     from 模块名 import 需使用的函数、类、变量
# 使用格式:     函数、类、变量   无需通过模块名引用
from utils import name, sum, Person

print('---' * 30)
print(name)
res = sum(1, 8)
print(res)
print(Person("mike", 20))
# 导入格式3:     from 模块名 import *
# 使用格式:     函数、类、变量   无需通过模块名引用

from utils import *
print(name)
print(sum(1,9))

1.1.2 导入冲突
"""
通过as重命名,可以解决冲突
from 模块名 import 变量 as 别名1, 函数 as 别名2, 类 as 别名3
"""


from utils import name as uname,sum as usum,Person as uPerson
from sum import name as sname,sum as ssum
print(uname)
print(sname)
print(usum(1,9))
print(ssum(8,1))


1.1.3 __name__作用说明
  • 把导入模块不被执行的代码放在if __name__ == '__main__'里面
# 导入模块,会执行1次文件里面的代码

def sum(a,b):
    return a+b

#程序的入口
if __name__ == '__main__':
    res = sum(1,8)
    print(res)

1.2 包

  • 包是一个特殊的文件夹,文件夹里包含一个__init__.py

    • 模块主要用于管理代码
    • 包主要用于管理模块
    • __init__.py主要写一下初始化的代码或导模块的语句,如果没有这部分需求,此文件可以没有
  • 包的创建

    • 在 PyCharm 中支持直接创建包, 工程根目录上鼠标
      右键 -> New -> Python Package
1.2.1 导入包中模块
"""
说明:导入方式有很多,后面使用的时候,先查先用即可
方式1:
导入格式:   import 包名.模块名
            包名就是文件夹名    模块名就是文件里某个文件名字
使用格式:   包名.模块名.工具名   (类名、函数、变量)

方式2:
导入格式:   from 包名.模块名 import 工具名
使用格式:   工具名   (类名、函数、变量)
"""
import pk.calac
print(pk.calac.name)
print(pk.calac.sum(10,9))

print("=========import 包名.模块名==========")

import pkg3.calac
print(pkg3.calac.sum(9,5))


print("========= from 包名.模块名 import 工具名==========")
from pkg3.calac import *
print(name)
print(sum(8,2))

print("========= from")
from pkg3.calac import name,sum,Person

print(name)
print(sum(8,2))
print("=========")

1.3 系统的内置模块

二、异常处理

2.1 异常介绍

  • 什么是异常?
    • 程序在运行过程中,发生了未知的事件,影响到了程序的正常运行
    • 异常是一种事件
    • 异常会影响到程序正常运行

2.2 捕获异常

  • 为了保证程序正常运行
2.2.1 捕获异常try-except
"""
try:
    可能发生异常的代码
except Exception as 异常对象名:
    # Exception : 为系统提供的异常类, 凡是未知错误类型, 都可以尝试使用该异常类进行异常类型匹配
    print(异常对象名) 即可获取异常的信息描述

说明:
1. 如果希望程序无论出现任何错误, 都不会因为Python解释器抛出异常而被终止, 可以捕获 Exception
2. except Exception as e: e表示捕获到的异常对象, 记录异常的错误信息, e为惯用变量名, 可以自定义

需求:
1. 提示用户输入一个整数
    - 用户输入的可能不是一个整数
2. 使用 8 除以用户输入的整数并且输出
    - 0不能做除数
"""
# a = 10
# b = 0
# try:
#     res = a//b
#
# except:
#     print("有异常")

# try  except Exception  as xxx  捕获异常  可以输出异常信息


# a = 10
# b = 0
# try:
#     res = a // b
#
# except Exception as e:
#     print(e)

# Exception 会捕获各类 错误信息  as e  可以输出错误信息  e 是变量名称 可以自定义
# try:
#     # pygame.init()
#     num = int(input(''))
# except Exception as err:
#     print(err)

a = 10
b = 0
lst = [1, 2, 3, 4, 5]

# 所有的错误信息都有一个父类叫做BaseException

try:
    res = lst[6]
# except ZeroDivisionError as z:
except IndexError as z:
    print(z)

print("======")

2.2.2 捕获异常完整语法
"""
应用场景:
1. 成功打开文件的前提下,后面读写文件,不管有没有异常,最终都要关闭文件
2. 成功连接网络的前提下,后面发送或接收网络数据,不管有没有异常,最终都要断开连接

try:
    可能发生异常的代码
except:
    处理异常的代码
else:
    没有发生异常,except不满足执行else
finally:
    不管有没有异常,最终都要执行

需求:
1. 获取用户输入的数字,转换为int
2. 如果输入不是整数,转换会产生异常,提示输入错误
3. 如果是整数, 则进一步判断是奇数还是偶数
4. 最终提示: 程序运行结束
"""

try:
    num = int(input('请输入一个整数'))
except ValueError as V:
    print(V)

else:
    print("你输入的数",num)
finally:
    print("程序运行结束")

2.3 自定义异常

2.3.1 常见的异常类型介绍
2.3.2 自定义异常

在这里插入图片描述

class 自定义异常名(Exception):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return self.msg

三、PyQt5

3.1 PyQt5简介和环境搭建

  • PyQt是一套Python的GUI开发框架,即图形用户界面开发框架

  • 其中PyQt是Qt(C++语言实现的)为Python专门提供的扩展

  • PySide官网:https://doc.qt.io/qtforpython-6/

  • 插件安装

    pip install 插件名字	# 安装
    pip uninstall 插件名字	# 卸载
    pip install 插件名字 -i 指定下载的镜像网址
    pip show 插件名字		# 查看插件名字
    
    # 安装PyQt5
    pip  install  PyQt5  -i https://pypi.tuna.tsinghua.edu.cn/simple
    # 安装Qt工具软件
    pip install PyQt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple
    # 安装PyQt5语法检测包(可选)
    pip install PyQt5-stubs -i https://pypi.tuna.tsinghua.edu.cn/simple
    # 安装PyQt5帮助文档(可选)
    pip install PyQtdoc -i https://pypi.tuna.tsinghua.edu.cn/simple
    # 查看安装版本
    pip  show  PyQt5
    pip  show  PyQt5-tools
    pip  show  PyQt5-stubs
    
  • 如果安装了帮助文档,帮助文档所在位置

在这里插入图片描述

  • 帮助文档配置教程(点我😊)

3.2 第一个Qt程序

3.2.1 第一个Qt窗口
"""
# 0. 导入模块
# 1.创建应用程序
# 2.创建窗口
# 3.显示窗口
# 4.等待窗口停止
"""
import sys

from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()



# 显示窗口
w.show()

# 等待中止
sys.exit(app.exec_())

3.2.2 窗口的相关设置
"""
# 设置窗口标题
# 设置窗口尺寸
# 设置图标
# 鼠标停留在控件上时就会显示ToolTip的信息
"""
import sys

# 导包 模块
from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)

# 创建窗口
w = QWidget()

# 设置标题
w.setWindowTitle("QQ开发版")
# 窗口大小
w.resize(800, 600)
# 设置气泡提示

w.setToolTip("这是一个窗口")

# 展示
w.show()

# 等待中止
sys.exit(app.exec_())

3.3 常用控件

3.3.1 标签QLabel
3.3.1.1 显示文字
"""
# 创建QLabel标签对象
# 设置文本内容
# 指定主窗口为父对象,标签放在主窗口上
"""


import sys

from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()
#
# #后续的创建按钮 文本 图像 等等 都是放到这里
# 显示文字
# 创建QLabel标签对象
label = QLabel()
# 设置文本内容
label.setText("Hello 你好呀")
label.move(100,100)
print(label.text())
# 指定主窗口为父对象,标签放在主窗口上
label.setParent(w)

# 显示窗口
w.show()

# 等待中止
sys.exit(app.exec_())

3.3.1.2 显示图片
"""
# 创建QLabel标签对象
# 创建QPixmap对象
# 设置标签图片
# 指定主窗口为父对象,标签放在主窗口上
# 根据图片大小设置窗口大小
"""
import sys

from PyQt5.QtGui import QPixmap, QIcon
from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()


pixmap = QPixmap("img/img.png")

#设置程序的icon
#windows 设置
w.setWindowIcon(QIcon(pixmap))

# 创建QLabel标签对象

label = QLabel()
# 创建QPixmap对象
pixmap = QPixmap("img/img.png")
# 设置标签图片
label.setPixmap(pixmap)
# 指定主窗口为父对象,标签放在主窗口上
label.setParent(w)
# 根据图片大小设置窗口大小
w.resize(pixmap.width(), pixmap.height())

# 显示窗口
w.show()

# 等待中止
sys.exit(app.exec_())
3.3.2 输入框
3.3.2.1 单行输入框QLineEdit
"""
# 创建QLineEdit对象
# 设置默认提示语
# 设置内容为"hello world"
# 设置最大输入的长度
# 获取文本内容
# 设置输入框的回显模式:密码模式
# 指定父对象
"""

import sys

from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()

# 创建QLineEdit对象
edit = QLineEdit()
# 设置默认提示语
edit.setPlaceholderText("请输入你的银卡卡账号:")
# 设置内容为"hello world"
edit.setText("9527")
# 设置最大输入的长度
edit.setMaxLength(10)
# 获取文本内容
print(edit.text())
#
# 设置输入框的回显模式:密码模式
edit.setEchoMode(edit.Password)
# 指定父对象
edit.setParent(w)
# 显示窗口
w.show()

# 等待中止
sys.exit(app.exec_())
3.3.2.2 多行输入框QTextEdit
"""
# 创建QTextEdit对象
# 设置提示内容
# 设置默认内容
# 设置内容
# 获取内容
# 清空内容
# 指定父对象
"""

import sys

from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()
# 创建QTextEdit对象
txt = QTextEdit()
# 设置提示内容
txt.setPlaceholderText("请输入你的履历")
# 设置默认内容
txt.setText("Hello world")
# 设置内容
txt.setText("Hello")
# 获取内容
print(txt.toPlainText())
# 清空内容
txt.clear()
# 指定父对象
txt.setParent(w)


# 显示窗口
w.show()

# 等待中止
sys.exit(app.exec_())

3.3.3 按钮QPushButton
"""
# 创建QPushButton对象
# 设置按钮的文本内容
# 获取按钮的文本内容
# 指定父对象
"""

import sys

from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()
# 创建QPushButton对象
btn = QPushButton()
# 设置按钮的文本内容
btn.setText('点击抽奖')
# 获取按钮的文本内容
print(btn.text())
# 指定父对象
btn.setParent(w)

# 显示窗口
w.show()

# 等待中止
sys.exit(app.exec_())

3.4 信号和槽

3.4.1 按钮的信号与槽
  • 某些控件(部件)按下了,产生一个信号(事件)(理解为硬件的中断,实际上是软件层的中断)
  • 信号来了,处理信号对应的槽函数
  • 步骤
    • 1)要处理什么信号
    • 2)信号绑定的(连接的)对应槽函数
    • 3)定义槽函数(普通函数)
3.4.2 系统的信号和槽函数
# 按钮被点击了,调用关闭窗口的槽函数

import sys

from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()
# 创建QPushButton对象
btn = QPushButton()
# 设置按钮的文本内容
btn.setText('点击抽奖')
# 获取按钮的文本内容
print(btn.text())
# 指定父对象
btn.setParent(w)


def func():
    print("中奖五百万!")


# 方式1:自定义槽函数
btn.clicked.connect(func)

# 方式2:槽函数为匿名函数
#关闭窗口
btn.clicked.connect(w.close)

# 显示窗口
w.show()

# 等待中止
sys.exit(app.exec_())

3.5 布局

3.5.1 水平布局QHBoxLayout
"""
# 创建QHBoxLayout对象
# 添加5个QPushButton控件
# 窗口添加布局
"""

import sys

from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()
# 创建QHBoxLayout对象
layout = QHBoxLayout()
# 添加5个QPushButton控件
btn1 = QPushButton("按钮1")
btn2 = QPushButton("按钮2")
btn3 = QPushButton("按钮3")
btn4 = QPushButton("按钮4")
btn5 = QPushButton("按钮5")
text = QLineEdit()

#按钮添加到布局中
layout.addWidget(btn1)
layout.addWidget(btn2)
layout.addWidget(btn3)
layout.addWidget(btn4)
layout.addWidget(btn5)
layout.addWidget(text)

# 窗口添加布局  setLayout
w.setLayout(layout)
# btn1.move(50,50)
# btn2.move(80,80)
# btn3.move(100,100)
# btn4.move(150,150)
# btn1.setParent(w)
# btn2.setParent(w)
# btn3.setParent(w)
# btn4.setParent(w)
# btn5.setParent(w)
w.resize(800,600)

# 显示窗口
w.show()

# 等待中止
sys.exit(app.exec_())


3.5.2 竖直布局QVBoxLayout
"""
# 创建QVBoxLayout对象
# 添加5个QPushButton控件
# 窗口添加布局
"""


import sys

from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()
# 创建QHBoxLayout对象
layout = QVBoxLayout()
# 添加5个QPushButton控件
btn1 = QPushButton("按钮1")
btn2 = QPushButton("按钮2")
btn3 = QPushButton("按钮3")
btn4 = QPushButton("按钮4")
btn5 = QPushButton("按钮5")
text = QLineEdit()

#按钮添加到布局中
layout.addWidget(btn1)
layout.addWidget(btn2)
layout.addWidget(btn3)
layout.addWidget(btn4)
layout.addWidget(btn5)
layout.addWidget(text)

# 窗口添加布局  setLayout
w.setLayout(layout)

w.resize(800,600)

# 显示窗口
w.show()

# 等待中止
sys.exit(app.exec_())


3.5.3 表单布局QFormLayout
"""
# 创建QFormLayout对象
form = QFormLayout()
# 创建用户名QLineEdit对象
user = QLineEdit()
# 创建密码QLineEdit对象
pwd = QLineEdit()
# 密码QLineEdit对象设置密码属性
pwd.setEchoMode(pwd.Password)
# 创建手机号QLineEdit对象
tel = QLineEdit()
# QFormLayout对象添加addRow用户名、密码、手机号控件
form.addRow("user",user)
form.addRow("pwd",pwd)
form.addRow("tel",tel)
# 创建QPushButton对象
btn = QPushButton("注册")
form.addRow("",btn)
# QPushButton对象信号clicked绑定自定义槽函数on_submit
deg function():
    pass
btn.clicked.connect(function)
# 槽函数on_submit实现功能:分别获取用户名、密码、手机号文本内容
# QFormLayout对象添加addRow按钮
# 窗口设置布局
w.setLayout(form)
"""


import sys

from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()
# 设置 form layout
form = QFormLayout()

# 创建用户名QLineEdit对象  单行文本
user = QLineEdit()
# 创建密码QLineEdit对象
pwd = QLineEdit()
# 密码QLineEdit对象设置密码属性
pwd.setEchoMode(pwd.Password)
# 创建手机号QLineEdit对象
tel = QLineEdit()

# 创建QPushButton对象
btn = QPushButton("注册信息")
# QFormLayout对象添加addRow用户名、密码、手机号控件
# QFormLayout对象添加addRow按钮
form.addRow("用户名:", user)
form.addRow("密 码:",pwd)
form.addRow("手机号:",tel)
# form.addRow("注册",btn)
form.addRow("",btn)

#将layout设置到窗口
w.setLayout(form)
# 槽函数on_submit实现功能:分别获取用户名、密码、手机号文本内容
def on_submit():
    print(user.text(),pwd.text(),tel.text())


# QPushButton对象信号clicked绑定自定义槽函数on_submit

btn.clicked.connect(on_submit)

# w.resize(640,480)
# 显示窗口
w.show()

# 等待中止
sys.exit(app.exec_())





3.5.4 嵌套布局

在这里插入图片描述

"""
# 创建QHBoxLayout对象h_layout
# 创建QVBoxLayout对象v_layout1,添加一个QPushButton对象1
# h_layout添加v_layout1对象
# 创建QVBoxLayout对象v_layout2,添加QPushButton对象2, QPushButton对象3
# h_layout添加v_layout2对象
# 创建QVBoxLayout对象v_layout3,添加QPushButton对象4, QPushButton对象5, QPushButton对象6
# h_layout添加v_layout3对象
# 创建QVBoxLayout对象v_layout4,添加QPushButton对象7, QPushButton对象8, QPushButton对象9, QPushButton对象10
# h_layout添加v_layout4对象
# 窗口添加布局h_layout
"""
import sys

from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()
# 创建QHBoxLayout对象h_layout (整个水平布局)
h_layout = QHBoxLayout()

# 创建QHBoxLayout对象v_layout1,添加一个QPushButton对象1  整个水平布局中的第一个水平布局layout1
v_layout1 = QHBoxLayout()
btn1 = QPushButton("btn1")
btn2 = QPushButton("按钮1")
v_layout1.addWidget(btn1)
v_layout1.addWidget(btn2)
# h_layout添加v_layout1对象
h_layout.addLayout(v_layout1)
# 创建QVBoxLayout对象v_layout2,添加QPushButton对象2, QPushButton对象3
v_layout2 = QVBoxLayout()
v_layout2.addWidget(QPushButton("btn2"))
v_layout2.addWidget(QPushButton("btn3"))
# h_layout添加v_layout2对象
h_layout.addLayout(v_layout2)
# 创建QVBoxLayout对象v_layout3,添加QPushButton对象4, QPushButton对象5, QPushButton对象6
v_layout3 = QVBoxLayout()
v_layout3.addWidget(QPushButton("btn4"))
v_layout3.addWidget(QPushButton("btn5"))
v_layout3.addWidget(QPushButton("btn6"))
# h_layout添加v_layout3对象
h_layout.addLayout(v_layout3)
# 创建QVBoxLayout对象v_layout4,添加QPushButton对象7, QPushButton对象8, QPushButton对象9, QPushButton对象10
v_layout4 = QVBoxLayout()
v_layout4.addWidget(QPushButton("按钮7"))
v_layout4.addWidget(QPushButton("按钮8"))
v_layout4.addWidget(QPushButton("按钮9"))
v_layout4.addWidget(QPushButton("按钮10"))
# h_layout添加v_layout4对象
h_layout.addLayout(v_layout4)
# 窗口添加布局h_layout
w.setLayout(h_layout)

# 显示窗口
w.show()
w.resize(800,600)
# 等待中止
sys.exit(app.exec_())

3.6 对话框

3.6.1 消息对话框QMessageBox
"""
# 创建QPushButton对象btn
# btn信号clicked绑定槽函数
# 槽函数中弹出消息QMessageBox对话框,并设置消息对话框的标题、内容、按钮,选择对话框后做出响应判断
# btn指定父对象
"""

import sys

from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()
# 创建QPushButton对象
btn = QPushButton()
# 设置按钮的文本内容
btn.setText('点击抽奖')
# 获取按钮的文本内容
print(btn.text())
# 指定父对象
btn.setParent(w)

# 创建QPushButton对象btn
# btn信号clicked绑定槽函数

def btn_click():
  res =   QMessageBox.information(w, '中奖信息',"请确认协议内容",QMessageBox.Yes|QMessageBox.No)
  if res == QMessageBox.Yes:
      print("ok")
# 槽函数中弹出消息QMessageBox对话框,并设置消息对话框的标题、内容、按钮,选择对话框后做出响应判断
# btn指定父对象
btn.clicked.connect(btn_click)

# 显示窗口
w.show()

# 等待中止
sys.exit(app.exec_())

3.6.2 输入对话框QInputDialog
"""
# 创建QVboxLayout对象layout
# 创建QLabel对象label
# label设置内容"匿名"
# layout添加label
# 创建QPushButton对象btn
# btn设置内容"创建角色"
# layout添加btn
# btn的信号clicked连接槽函数show_dialog
# 槽函数中创建QInputDialog对象,获取用户输入的内容,给label设置内容
# 窗口添加布局
"""

import sys

from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()

# 创建QVboxLayout对象layout
layout = QVBoxLayout()
# 创建QLabel对象label
label = QLabel()
# label设置内容"匿名"
label.setText("匿名")
# layout添加label
layout.addWidget(label)
# 创建QPushButton对象btn
btn = QPushButton()
# btn设置内容"创建角色"
btn.setText("创建角色")
# layout添加btn
layout.addWidget(btn)


# btn的信号clicked连接槽函数show_dialog
def show_dialog():
    res, flag = QInputDialog.getText(w, "标题", "请创建角色")
    if flag:
        print("创建角色成功:", res)


btn.clicked.connect(show_dialog)
# 槽函数中创建QInputDialog对象,获取用户输入的内容,给label设置内容
# 窗口添加布局
w.setLayout(layout)

# 显示窗口
w.show()

# 等待中止
sys.exit(app.exec_())

3.7 单、复选框

3.7.1 单选框QRadioButton
"""
# 创建QRadioButton对象btn1,设置内容"男"
# 创建QRadioButton对象btn2,设置内容"女"
# 设置btn2为选中状态
# 创建QButtonGroup对象group,将btn1和btn2添加到group
# group的信号buttonToggled连接槽函数on_group_toggled
# 槽函数参数为QRadioButton对象,里面打印被按下按钮的文本,打印选中状态
# 创建VBoxLayout对象layout,将btn1和btn2添加到layout
# 窗口添加布局
"""
import sys

from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()


# 创建VBoxLayout对象layout,将btn1和btn2添加到layout
layout = QHBoxLayout()
# 创建QRadioButton对象btn1,设置内容"男"
radio = QRadioButton("男")
# 创建QRadioButton对象btn2,设置内容"女"
radio2 = QRadioButton("女")
# 设置btn2为选中状态
radio2.setChecked(True)

# group的信号buttonToggled连接槽函数on_group_toggled
# 槽函数参数为QRadioButton对象,里面打印被按下按钮的文本,打印选中状态
# 创建VBoxLayout对象layout,将btn1和btn2添加到layout
layout.addWidget(radio)
layout.addWidget(radio2)
# 窗口添加布局
w.setLayout(layout)

#定义槽函数
def on_toggled():
    if radio.isChecked():
        print("男被选中")
    if radio2.isChecked():
        print("女被选中")

#信号绑定
radio.toggled.connect(on_toggled)
radio2.toggled.connect(on_toggled)

# 显示窗口
w.show()

# 等待中止
sys.exit(app.exec_())

3.7.2 复选框QCheckBox
"""
# 创建QCheckBox对象box1,并设置文本为“学习”
# 创建QCheckBox对象box2,并设置文本为“睡觉”
# 创建QCheckBox对象box3,并设置文本为“工作”
# box1、box2、box3的信号statusChanged和槽函数box_slot绑定
# 槽函数判断是否被选中
# 创建QHBoxLayout对象layout,并添加box1、box2、box3
# 窗口添加布局
"""

import sys

from PyQt5.QtWidgets import *

# 创建应用程序
app = QApplication(sys.argv)
# 创建窗口  w就是我们创建的窗口对象
w = QWidget()
# 创建VBoxLayout对象layout,将btn1和btn2添加到layout
layout = QHBoxLayout()
#创建复选框

box1 = QCheckBox("语文")
box2 = QCheckBox("数学")
box3 = QCheckBox("英语")

layout.addWidget(box1)
layout.addWidget(box2)
layout.addWidget(box3)


# 槽函数判断是否被选中
def box_slot():
    if box1.isChecked():
        print("今天上语文课")
    if box2.isChecked():
        print("下节课上数学")
    if box3.isChecked():
        print("下节课上英语")


# box1、box2、box3的信号statusChanged和槽函数box_slot绑定
box1.stateChanged.connect(box_slot)
box2.stateChanged.connect(box_slot)
box3.clicked.connect(box_slot)



# 窗口添加布局
w.setLayout(layout)

#定义槽函数




# 显示窗口
w.show()

# 等待中止
sys.exit(app.exec_())

3.8 PyQt面向对象开发

"""
类名:MyWidget继承QWidget
实例方法:
    __init__(self, parent=None): 调用父类的__init__(parent)方法,调用初始化窗口
    init_ui(): 窗口控件的添加、布局、信号和槽处理

程序入口:
    # 1.创建应用程序
    # 2.创建窗口
    # 3.显示窗口
    # 4.等待窗口停止
"""
import sys

from PyQt5.QtWidgets import *


# 定义我们的widget类
class myWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
    #     调用init_UI
        self.init_ui()

    def init_ui(self):
        '''
        初始化ui
        :return:
        '''
        # self.setWindowTitle("设置标题")


if __name__ == '__main__':
    # 创建程序app
    app = QApplication(sys.argv)
    w = myWidget()
    w.show()
    sys.exit(app.exec_())

3.9 Qt Designer

3.9.1 配置PyCharm的PyQt工具
  • 教程:https://www.yuque.com/icheima/python/qt_designer#aiIoe

在这里插入图片描述

在这里插入图片描述

3.9.2 通过Designer设计界面

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 新建ui包

    在这里插入图片描述

  • 打开designer界面

在这里插入图片描述

  • 新建Widget窗口

    在这里插入图片描述

  • 根据需要拖拽控件,然后保存

在这里插入图片描述

在这里插入图片描述

  • ui文件转换为python代码

    • 注意:每次修改了ui文件,记得保存,然后就得重新把ui文件转换为python代码

    在这里插入图片描述

  • 加载ui文件模板代码

    • 导包中模块 from ui.ui模块文件名 import Ui_对象名

    在这里插入图片描述

    • 实例化ui模块对象,调用setupUi()方法
3.9.3 如何使用ui上面的控件

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/584367.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【百度Apollo】探索自动驾驶:Apollo 新版本 Beta 全新的Dreamview+,便捷灵活更丰富

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引入一、Dreamview介绍二、Dreamview 新特性2.1、基于模式的多场景——流程更简洁地图视角调节:调试流…

JavaEE技术之MySql高级(索引、索引优化、sql实战、View视图、Mysql日志和锁、多版本并发控制)

文章目录 1. MySQL简介2. MySQL安装2.1 MySQL8新特性2.2 安装MySQL2.2.1 在docker中创建并启动MySQL容器:2.2.2 修改mysql密码2.2.3 重启mysql容器2.2.4 常见问题解决 2.3 字符集问题2.4 远程访问MySQL(用户与权限管理)2.4.0 远程连接问题1、防火墙2、账号不支持远程…

Python中的类(Class)详解——新手指南

在Python编程中,类(Class)是一个非常重要的概念,它允许程序员创建自己的对象类型。这些对象类型可以包含数据(称为属性)和函数(称为方法),它们定义了这些对象的行为。本文…

Spring-Mybatis-Xml管理(动态sql语句,sql语句复用)

目录 前置条件 动态SQL语句 动态删除数据 1.集合类型:数组 2.集合类型: List 型 SQL语句重用 说明 🧨前置条件 已经创建了实体类(这边举个例子) 实体类User表 表中的字段名User实体类的属性值id (bigint auto increment) 长整型 自动增长private Long iduser…

场景文本检测识别学习 day06(Vi-Transformer论文精读)

Vi-Transformer论文精读 在NLP领域,基于注意力的Transformer模型使用的非常广泛,但是在计算机视觉领域,注意力更多是和CNN一起使用,或者是单纯将CNN的卷积替换成注意力,但是整体的CNN 架构没有发生改变VIT说明&#x…

C++入门第二节

点赞关注不迷路!,本节涉及c入门关键字、命名空间、输入输出... 1. C关键字 C总计63个关键字,C语言32个关键字 asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenam…

LeetCode-hot100题解—Day5

原题链接:力扣热题-HOT100 我把刷题的顺序调整了一下,所以可以根据题号进行参考,题号和力扣上时对应的,那么接下来就开始刷题之旅吧~ 1-8题见LeetCode-hot100题解—Day1 9-16题见LeetCode-hot100题解—Day2 17-24题见LeetCode-hot…

V23 中的新增功能:LEADTOOLS React Medical Web 查看器

LEADTOOLS (Lead Technology)由Moe Daher and Rich Little创建于1990年,其总部设在北卡罗来纳州夏洛特。LEAD的建立是为了使Daher先生在数码图象与压缩技术领域的发明面向市场。在过去超过30年的发展历程中,LEAD以其在全世界主要国家中占有的市场领导地位…

21.Nacos集群搭建

模拟Nacos三个节点,同一个ip,启动三个不同的端口: 节点 nacos1, 端口:8845 节点 nacos2, 端口:8846 节点 nacos3, 端口:8847 1.搭建数据库,初始化数据库表结构 这里我们以单点的数据库为例 首先新建一…

2024年 Java 面试八股文——Redis篇

目录 1、介绍下Redis Redis有哪些数据类型 难度系数:⭐ 2、Redis提供了哪几种持久化方式 难度系数:⭐ 3、Redis为什么快 难度系数:⭐ 4、Redis为什么是单线程的 难度系数:⭐ 5、Redis服务器的的内存是多大…

基于飞腾D2000全国产化高速公路一体化收费站解决方案:站数据服务器、站AI服务器、收费系统、监控系统

高速公路一体化收费站解决方案 行业 交通工程及沿路设施作为公路的一个重要组成部分,对城市互联和城市发展具有重要意义,因此围绕高速公路的专用收费 站设计和建设,将有效促进枢纽集散系统与高速公路连通,显著提升城市高速集散能…

ES的脑裂现象

目录 0 集群结点的职责1 什么是脑裂现象2 造成脑裂现象的原因2.1 网络问题(最常见)2.2 主节点负载过大,资源耗尽,别的结点ping不到主节点2.3 主节点JVM内存回收时间过长导致 3 脑裂现象的解决方案3.1 局域网部署3.2 角色分离&…

C语言从入门到精通-C静态库的生成及使用

静态库 什么是静态库 C静态库(Static Library)是C语言编程中常用的一种库文件形式。与动态库(Dynamic Library)相比,静态库在程序编译时会被完全嵌入到最终的可执行文件中,因此生成的可执行文件不依赖于外…

BiLSTM-KDE的双向长短期记忆神经网络结合核密度估计多变量回归区间预测(Matlab)

BiLSTM-KDE的双向长短期记忆神经网络结合核密度估计多变量回归区间预测(Matlab) 目录 BiLSTM-KDE的双向长短期记忆神经网络结合核密度估计多变量回归区间预测(Matlab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.BiLS…

后台架构总结

前言 疫情三年,全国各地的健康码成为了每个人的重要生活组成部分。虽然过去一年,但是回想起来任然历历在目。 今天我就通过当时基于小程序的健康码架构,来给大家讲一下如何基于java,springboot等技术来快速搭建一个后台业务系统…

人工智能分割分类model:nnUnet-paddle

文章目录 神经网络nnUnet和paddle都需要在Ubuntu下进行安装PaddleProject 神经网络 开源来自https://github.com/MIC-DKFZ/nnUNet 自建了仓库,但还不会用 来自 mmsegmentation有空去了解 . MICCAI 2020 也是用到这个网络 paddle上的是不是不能用… nnUnet和pad…

Linux基础IO(下)

目录 1. 缓冲区 1.1 定义 1.2 理解缓冲区 1.2.1 为什么要有缓冲区 1.2.2 缓冲区的工作原理 缓冲区什么时候写入,什么时候刷新? 2. 文件系统 2.1 什么是文件系统? 2.2 为什么要有文件系统? 2.3 认识文件的管理结构 2.…

绩效评估与持续反馈

高绩效团队认识到评论和反馈的商业价值,这是两种关键的绩效管理工具。绩效管理是 2023 年受访者最优先考虑的五项人力资源举措之一,学习和发展是另一项举措,绩效评估和持续反馈最近可能会受到人力资源团队的更多关注。 在这里,我…

每天五分钟玩转深度学习PyTorch:创建pytorch中的零维标量tensor

标量是什么? tensor张量是一个多维数组,零维就是一个点(就是本章的标量),一维就是向量,二维就是一般的矩阵,多维就相当于一个多维的数组,这和 numpy理解是一样的,不同的是Tensor不仅可以在CPU上跑,在GPU上也可以跑。 标量(scalar),只具有数值大小,而没有方向,…

python数据可视化:雷达图

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python数据可视化: 雷达图 选择题 关于以下代码输出的雷达图中,以下说法正确的是? import numpy as np import matplotlib.pyplot as plt from pylab impor…
最新文章