python【PyQt5】的环境搭建和使用(全网最全)其一

news2024/11/21 2:34:39

什么是pyQT

pyqt是一个用于创建GUI应用程序的跨平台工具包,它将python与qt库融为一体。也就是说,pyqt允许使用python语言调用qt库中的API。这样做的最大好处就是在保存了qt高运行效率的同时,大大提高开发效率。因为,使用python语言开发程序要比使用c++语言开发程序快的多。pyqt对qt做了完整的封装,几乎可以用pyqt做qt能做的任何事情。

        由于目前最新的pyqt版本是5.11,所以习惯上称呼为pyqt为pyqt5

为什么要开发桌面应用

       

桌面应用,也可以成为GUI应用,在windows处于非常火爆的15年时间(1995到2010)里是非常火的,不过最近几年web应用和移动应用抢了风头。尽管web和移动应用看似成为现在的主流。但桌面应用目前仍然为很多类型应用的首选。移动应用由于屏幕太小,机器性能远低于同时代的pc机,所以至少目前来看,在短时间内移动应用是无法取代pc应用的,而在pc浏览器上运行的web应用的主要优势是不需要安装的,只要有浏览器就可以运行。

        但缺点也显而易见,web应用在浏览器部分的逻辑代码通常都是由于javascript语言编写的,运行效率比较低,而且web应用是无法完全控制本机的硬件的,如摄像头,蓝牙设备,打印机,串口等,web应用在用户体验上也不如同时代的桌面应用,而web设备不擅长的事正好是桌面应用的强项,因此,在未来的几十年,桌面应用仍然会占有非常重要的地位。

要讲些什么

Qt Designer

pyQt5基本窗口控件(QMainWindow,Qwidget,Qlabel,QLineEdit,菜单,工具栏等)

pyQt5高级控件(QTableView,QListView,容器,多线程等)

pyQt5布局管理(QBoxLayout,QGridLayout,QFormLayout,嵌套布局等)

pyQt5信号与槽(事件处理,数据传递等)

pyQt5图形与特效(定制窗口风格,绘图,QSS与UI美化,不规则窗口,设置样式等)

pyQt5扩展应用(制作pyQt5安装程序,数据处理,第三方绘图库在pyQt5中的应用,UI自动化测试等)

搭建PyQt5开发环境

 参见CSDN:pyQt5环境的搭建_Hi~晴天大圣的博客-CSDN博客_pyqt5环境搭建

1 Python

2 PyQt模块插件

    PyQt5中插件的作用:
    QtDesigner——通过Qt语言进行UI设计(支持拖拽式的UI设计)
    PyUIC——主要用来将QtDesigner代码转化成Python代码
    Pyrcc—— 将图片、数据文件资源打包成py文件

3 PyCharm

因为这里存在网络慢的原因 我使用了手机数据分享给电脑的方式下载的PyQt5

 下载过程有些慢 只能耐性等待...

添加到环境变量:环境变量目录

 C:\Users\xiangbin\AppData\Local\Programs\Python\Python39\Lib\site-packages\PyQt5\Qt5\plugins

问题:在安装第三方库时出现报错"These Packages Do Not Match The Hashes From The Requirements File."

原因:通常是因为网速问题导致的下载错误,导致对应的哈希值不匹配。

解决方法:需要在pip时,添加"–upgrade"参数即可。通常这时下载还会报错timeout,因此多加一个"–default-timeout=100000" 更为保险(timeout的赋值可以视情况变化)。

pip install --upgrade --default-timeout=100000 packagename -i http://pypi.douban.com/simple

当使用conda安装完pyqt5后,在pycharm中配置额外模块时发现找不到designer.exe文件
经过查资料发现,是因为我安装pyqt5时,里面不带这个pyqt5-tools文件,所以在使用conda下的pip下载pyqt5-tools即可(conda是下载不了pyqt5-tools的)
解决方法,在命令行中输入pip install PyQt5-tools -i http://pypi.douban.com/simple --trusted-host=pypi.douban.com即可

python在虚拟解释器环境中使用pip安装第三方库出现Requirement already satisfied错误

原因是:用项目自己创建的虚拟解释器环境时,因为没有配置系统环境变量,所以找不到要安装的地址,不知道这个包要安装到那个位置。
解决办法,在安装语句中加- -target,指定安装的位置,用项目虚拟解释器环境安装的话,安装位置为项目中的虚拟环境中,默认为:

pip install --target=项目路径\项目名称\venv\Lib\site-packages 要安装的包名

例如:

pip install --target=C:\Users\xiangbin\AppData\Local\Programs\Python\Python39\Lib\site-packages  PyQt5-tools

1到14课时后续学习后添加!

课时15   开发第一个基于PyQt5的桌面应用

# @CSDN王家视频教程图书馆
# @Time 2022/11/22 17:59

import sys

from PyQt5.QtWidgets import QApplication,QWidget

'''
鉴于这两种情况中__name__的值是不同的:当一个模块被直接执行时,其__name__必然等于__main__;当一个模块被引用时,
其__name__必然等于文件名(不含.py)。所以利用判断__name__ == '__main__'的真假就可以将这两种情况区分出来。
'''
if __name__ == '__main__':
    #创建QApplication类的实例
    app=QApplication(sys.argv)
    #创建一个窗口
    w = QWidget()
    #设置窗口的尺寸
    w.resize(300,150)
    #移动窗口
    w.move(300,300)
    #设置窗口的标题
    w.setWindowTitle('第一个基于pyqt的桌面程序')
    #显示窗口
    w.show()
    #进入程序的主循环 并通过exit函数确保主循环安全结束
    sys.exit(app.exec_())

 课时16   打开QtDesigner设计师工具

 或者

ctrl+R预览

将.ui文件转换为.py文件

方法一: python -m PyQt5.uic.pyuic demo.ui -o demo.py

生成完成 !demo.py

方法二:

python文件夹//打开pyuic5程序 -o 文件名称 直接生成demo.py

推荐 方式三

 生成完成 !demo1.py

课时17   在QtDesigner中使用布局

全选控件 右键 选择布局 为水平布局

其他布局设置方式同理 因为第二扩展菜单截图 截不到 这里请参考

 CTRL + R 预览

 

 课时18   调用源文件:RunDemo.py调用demo.py文件

课时19   PyQt5中的浏览器控件-QtWebEngine

 新版本的QtDesigner里是没有WebView的,想要使用浏览器控件就需要自己安装QtWebEngine。安装之后也是没有图形界面的控件的,所以使用策略就是

用其他控件在图形界面布局,然后生成python代码之后在代码中修改

修改代码参考如下

from PyQt5 import QtWebEngineWidgets

self.webView = QtWebEngineWidgets.QWebEngineView(self.centralwidget)
self.webView.setGeometry(QtCore.QRect(300, 300, 451, 241))
self.webView.setUrl(QtCore.QUrl("https://markwannafly.blog.csdn.net/"))
self.webView.setObjectName("webView")

或者:如何在Python QT Designer中插入Web浏览器

课时20   Edit 编辑伙伴 编辑Tab顺序

课时21   在Qt Designer中设置信号与插槽

信号(signal)

是Qt的核心机制,也是PyQt的核心机制

信号:是由对象或者控件发射出去的消息

按钮的单击事件

当单击按钮时,按钮就会向外部发送单击消息,这些发送出去的信号需要一些代码来拦截,这些代码就是插槽上一个函数或者方法

一个信号可以和多个槽绑定,一个槽可以拦截多个信号

 课时22    动作编辑器

 课时23   主窗口类型

有3种窗口

QMainWindow

QWidget

QDialog

QMainWindow:可以包含菜单栏,工具栏,状态栏和标题栏

QDialog:是对话窗口的基类。没有菜单栏,工具栏,状态栏

QWidget:不确定窗口的用途,就使用QWidget

课时24   接下来用代码写一个程序Demo

 这里分享一个在线icon制作的网站:Icon图标在线制作工具

# @CSDN王家视频教程图书馆
# @Time 2022/11/22 23:14
import sys
from PyQt5.QtWidgets import QMainWindow,QApplication
from PyQt5.QtGui import QIcon
class FirstMainWin(QMainWindow):
    def __init__(self):
        super(FirstMainWin,self).__init__()
        #设置主窗口的标题
        self.setWindowTitle("第一个主窗口应用")

        #设置窗口的尺寸
        self.resize(400,300)

        self.status=self.statusBar()
        self.status.showMessage("只存在5秒的消息",5000)

#只有本程序可以调用 防止其他程序调用本程序
if __name__ == '__main__':
    app=QApplication(sys.argv)

    app.setWindowIcon(QIcon('./and.png'))
    main=FirstMainWin()
    main.show()
    # 程序的主循环
    sys.exit(app.exec_())

课时25   让程序居中窗口

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 11:38
# 龙文学python
# @Time 2022/11/22 23:14
import sys
from PyQt5.QtWidgets import QDesktopWidget,QMainWindow,QApplication
from PyQt5.QtGui import QIcon
class CenterForm(QMainWindow):
    def __init__(self):
        super(CenterForm,self).__init__()
        #设置主窗口的标题
        self.setWindowTitle("让主窗口居中")

        #设置窗口的尺寸
        self.resize(400,300)

    def center(self):
        # 获取屏幕坐标系
        screen=QDesktopWidget.screenGeometry()
        #获取窗口坐标系
        size=self.geometry()
        newLeft=(screen.width()-size.width())/2
        newTop=(screen.height()-size.height())/2
        self.move(newLeft,newTop)

#只有本程序可以调用 防止其他程序调用本程序
if __name__ == '__main__':
    app=QApplication(sys.argv)

    app.setWindowIcon(QIcon('./and.png'))
    main=CenterForm()
    main.show()
    # 程序的主循环
    sys.exit(app.exec_())

课时26    退出应用程序

 课时27   获取屏幕坐标系

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 12:11
import sys
from PyQt5.QtWidgets import QDesktopWidget,QHBoxLayout,QMainWindow,QApplication,QPushButton,QWidget

def onClick_Button():
    print("第一种方式 窗口坐标系 包含标题栏")
    print("widget.x()=%d" % widget.x())
    print("widget.y()=%d" % widget.y())
    print("widget.width()=%d" % widget.width())
    print("widget.height()=%d" % widget.height())

    print("第二种方式 窗口坐标系 不包含标题栏 只有工作区")
    print("widget.geometry().x()=%d" % widget.geometry().x())
    print("widget.geometry().y()=%d" % widget.geometry().y())
    print("widget.geometry().width()=%d" % widget.geometry().width())
    print("widget.geometry().height()=%d" % widget.geometry().height())

    print("第三种方式 暂时未理解全面")
    print("widget.frameGeometry().x()=%d" % widget.frameGeometry().x())
    print("widget.frameGeometry().y()=%d" % widget.frameGeometry().y())
    print("widget.frameGeometry().width()=%d" % widget.frameGeometry().width())
    print("widget.frameGeometry().height()=%d" % widget.frameGeometry().height())
app=QApplication(sys.argv)

widget=QWidget()
btn=QPushButton(widget)
btn.setText('按钮')

btn.clicked.connect(onClick_Button)

btn.move(55,55)

widget.resize(300,240)#设置工作区的尺寸

widget.move(250,200)

widget.setWindowTitle('屏幕坐标系')

widget.show()

sys.exit(app.exec_())

课时28   设置窗口和应用程序图标

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 12:40
'''
窗口的setWindowIcon方法用于设置窗口的图标,只在windows中可用
QAplication中的setQindowIcon的方法用于设置主窗口的图标和应用程序图标,但调用了窗口的setWindowIcon方法
QAplication中的setQindowIcon的方法就只能用于设置应用程序图标了
'''
import sys
from PyQt5.QtWidgets import QDesktopWidget,QMainWindow,QApplication
from PyQt5.QtGui import QIcon
class IconFrom(QMainWindow):
    def __init__(self):
        super(IconFrom,self).__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 250, 250)
        #设置主窗口的标题
        self.setWindowTitle("设置窗口图标")

        #设置窗口图标
        self.setWindowIcon(QIcon('./and.png'))


#只有本程序可以调用 防止其他程序调用本程序
if __name__ == '__main__':
    app=QApplication(sys.argv)

    #app.setWindowIcon(QIcon('./and.png'))
    main=IconFrom()
    main.show()
    # 程序的主循环
    sys.exit(app.exec_())

课时29 显示控件提示信息

 

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 12:51
#显示控件提示信息
import sys
from PyQt5.QtWidgets import QDesktopWidget,QHBoxLayout,QMainWindow,QApplication,QToolTip,QPushButton,QWidget
from PyQt5.QtGui import QIcon
from PyQt5.QtGui import QFont

class TooltipForm(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        QToolTip.setFont(QFont("SansSerif",12))
        self.setToolTip('今天是<b>星期五<b>')
        self.setGeometry(300,300,200,200)
        self.setWindowTitle('设置控件提示信息')

        # 添加Button
        self.button1 = QPushButton("我的按钮")
        self.button1.setToolTip('这是一个按钮ok')
        layout = QHBoxLayout()
        layout.addWidget(self.button1)

        mainFrame = QWidget()
        mainFrame.setLayout(layout)

        self.setCentralWidget(mainFrame)

    #按钮点击事件方法(自定义的槽)
        def onClick_Button(self):
            sender=self.sender()
            print(sender.text()+'按钮被按下')
            app=QApplication.instance()
            #退出应用程序
            app.quit()


#只有本程序可以调用 防止其他程序调用本程序
if __name__ == '__main__':
    app=QApplication(sys.argv)

    app.setWindowIcon(QIcon('./and.png'))
    main=TooltipForm()
    main.show()
    # 程序的主循环
    sys.exit(app.exec_())

课时30 QLabel控件的基本用法

QLabel控件

setAlignment():设置文本的对齐方式

setIndent():设置文本缩进

text():获取文本内容

selectedText():返回所选择的字符

setWordWrap():设置是否允许换行

QLabel常用的信号(事件):

1.当鼠标滑过QLabel控件时出发:linkHovered

2.当鼠标单击QLabel控件时触发:linkActivated

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 12:51
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout  # 垂直布局
from PyQt5.QtGui import QPalette  # 调色版
from PyQt5.QtGui import QPixmap  # 展示图片
from PyQt5.QtCore import Qt  # 有一些常量在这里面,eg:blue


class QLabelDdemo(QWidget):
    def __init__(self):
        super(QLabelDdemo, self).__init__()
        self.initUI()

    def initUI(self):
        label1 = QLabel(self)
        label2 = QLabel(self)
        label3 = QLabel(self)
        label4 = QLabel(self)

        label1.setText('<font color=yellow>这是一个文本标签</font>')
        label1.setAutoFillBackground(True)  # 自动填充背景
        palette = QPalette()
        # 设置背景色
        palette.setColor(QPalette.Window, Qt.blue)#设置背景色
        # 对label1设置调色版
        label1.setPalette(palette)

        # 跳转到一个网页或者触发一个点击事件
        label2.setText("<a href='#'>欢迎使用Python GUI程序</a>")

        # 文本居中
        label3.setAlignment(Qt.AlignCenter)
        # 提示信息
        label3.setToolTip('这是一个图片标签')
        label3.setPixmap(QPixmap('./and.png'))

        # 如果设为True,用浏览器打开网页,如果设为False,调用槽函数
        label4.setOpenExternalLinks(True)
        label4.setText("<a href='www.baidu.com'>打开百度</a>")
        # 右对齐
        label4.setAlignment(Qt.AlignRight)
        label4.setToolTip('这是一个超级链接')

        vbox = QVBoxLayout()
        vbox.addWidget(label1)
        vbox.addWidget(label2)
        vbox.addWidget(label3)
        vbox.addWidget(label4)

        # 绑定信号和槽
        # 滑过事件
        label2.linkHovered.connect(self.linkHovered)
        # 单击事件
        label4.linkActivated.connect(self.linkClicked)

        self.setLayout(vbox)
        self.setWindowTitle('QLabel控件演示')
        self.resize(400, 300)
        return

    def linkHovered(self):
        print('当鼠标滑过label2标签时,触发事件')

    def linkClicked(self):
        print('当鼠标单击label4标签时,触发事件')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QLabelDdemo()
    main.show()
    sys.exit(app.exec_())

课时31 QLabel与伙伴关系

伙伴关系

举例:栅格布局下给控件设置伙伴关系

addWidget函数:

mainLayout . addWidget(控件对象, rowIndex, columnIndex, row, column)

第一个参数是要添加的控件对象,第二个和第三个是位置索引(行,列),就像矩阵一样是从(0,0)开始的,第四,五参数是空间大小,第四个是占几行,第五个是占几列

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 14:12
from PyQt5.QtWidgets import *
import sys

'''
QLabel与伙伴控件
控件对象 #组件对象
rowIndex,columnIndex #控件位置
row,column #指定控件的尺寸
mainLayout.addWidget(控件对象,rowIndex,columnIndex,row,column)
'''
class QLabelBuddy(QDialog):
    def __init__(self):
        super(QLabelBuddy, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QLabel与伙伴关系')
        self.resize(400, 150)
        # &代表设置热键,其后第一个字母就是热键,不区分大小写,Alt+热键调用即可
        nameLabel = QLabel('&Name(N)', self)  # designer下的label
        nameLineEdit = QLineEdit(self)  # designer下的lineEdit,即文本输入框
        # 设置伙伴关系
        nameLabel.setBuddy(nameLineEdit)

        passwordLabel = QLabel('&Password(P)', self)  # designer下的label
        passwordLineEdit = QLineEdit(self)  # designer下的lineEdit,即文本输入框
        # 设置伙伴关系
        passwordLabel.setBuddy(passwordLineEdit)

        btnOK = QPushButton('&OK(O)')
        btnCancel = QPushButton('&Cancel(C)')
        # 栅格布局
        mainlayout = QGridLayout(self)
        mainlayout.addWidget(nameLabel, 0, 0)  # 放在第一行第一列
        # 放在第一行第二列,占用空间大小为一行两列(占用大小一行两列意思就是编辑框宽是标签控件的两倍)
        mainlayout.addWidget(nameLineEdit, 0, 1, 1, 2)
        mainlayout.addWidget(passwordLabel, 1, 0)  # 放在第二行第一列
        mainlayout.addWidget(passwordLineEdit, 1, 1, 1, 2)  # 放在第二行第二列,占用空间大小为一行两列

        mainlayout.addWidget(btnOK, 2, 1)  # 第三行第二列
        mainlayout.addWidget(btnCancel, 2, 2)  # 第三行第三列
        return


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QLabelBuddy()
    main.show()
    sys.exit(app.exec_())

课时32 QLineEdit控件与回显模式


 

高级功能:EchoMode(回显模式)

基本功能:输入单行文本

4种回显模式:

1.Normal

就是正常的文本框输入,我们输入一个,文本框上就有一个

2.NoEcho

比如Linux下输入密码,输了半天感觉屏幕上啥也没输,但其实输入了,只不过不显示到屏幕上而已

3.Password

就像QQ登录一样,回显但回显的是小黑圆圈,用于输入密码

4.PasswordEchoOnEdit

也是输入密码时,处于编辑时会回显,但离开编辑状态时(比如把鼠标移到别的编辑框时)则变成小黑圆圈

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 14:44

'''
课时32 QLineEdit控件与回显模式(EchoMode)
'''
from PyQt5.QtWidgets import *
import sys


class QLineEditEchoMode(QDialog):
    def __init__(self):
        super(QLineEditEchoMode, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('文件输入框的回显模式')
        self.resize(400, 300)
        # 表单布局
        formLayout = QFormLayout()
        # 创建编辑框
        normalLineEdit = QLineEdit()
        noEchoLineEdit = QLineEdit()
        passwordLineEdit = QLineEdit()
        passwordEchoOnEditLineEdit = QLineEdit()
        # 放入表单布局中
        formLayout.addRow('Normal', normalLineEdit)
        formLayout.addRow('NoEcho', noEchoLineEdit)
        formLayout.addRow('Password', passwordLineEdit)
        formLayout.addRow('PasswordEchoOnEdit', passwordEchoOnEditLineEdit)
        # placeholdertext(没输入时文本框里默认显示的灰色字体)
        normalLineEdit.setPlaceholderText('Normal')
        noEchoLineEdit.setPlaceholderText('NoEcho')
        passwordLineEdit.setPlaceholderText('Password')
        passwordEchoOnEditLineEdit.setPlaceholderText('PasswordEchoOnEdit')
        # 设置文本框回显模式
        normalLineEdit.setEchoMode(QLineEdit.Normal)
        noEchoLineEdit.setEchoMode(QLineEdit.NoEcho)
        passwordLineEdit.setEchoMode(QLineEdit.Password)
        passwordEchoOnEditLineEdit.setEchoMode(QLineEdit.PasswordEchoOnEdit)

        self.setLayout(formLayout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QLineEditEchoMode()
    main.show()
    sys.exit(app.exec_())


课时33 限制QLineEdi t控件的输入

校验器

如限制只能输入整数、浮点数或满足一定条件的字符串

代码问题:

限制范围的函数setRange有bug 需要正则表达式解决bug 可能在苹果系统可以(应该也不行) win系统不行

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 15:04 课时33 限制QLineEdi t控件的输入

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator  # 最后一个是正则表达式校验器
from PyQt5.QtCore import QRegExp  # 正则表达式类


class QLineEditValidator(QWidget):
    def __init__(self):
        super(QLineEditValidator, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('文龙学校验器')
        # 创建表单布局
        formLayout = QFormLayout()

        intLineEdit = QLineEdit()
        doubleLineEdit = QLineEdit()
        validatorLineEdit = QLineEdit()

        formLayout.addRow('整数类型', intLineEdit)
        formLayout.addRow('浮点类型', doubleLineEdit)
        formLayout.addRow('数字和字母', validatorLineEdit)

        intLineEdit.setPlaceholderText('整型[1,99]')
        doubleLineEdit.setPlaceholderText('浮点类型[-360,360]')
        validatorLineEdit.setPlaceholderText('数字和字母')

        # 整数校验器[1,99]
        intValidator = QIntValidator(self)  # 因为此函数需要一个QWidget对象作为参数,所以把自己传进去了
        intValidator.setRange(1, 99)  # 试了试可以输入0
        # 浮点校验器[-1,360],精度:小数点后2位
        doubleValidator = QDoubleValidator(self)  # 传self原因同上
        doubleValidator.setRange(-1, 360)  # setRange有bug 需要正则表达式解决bug 可以在苹果系统可以(没有试过) win系统不行
        doubleValidator.setNotation(QDoubleValidator.StandardNotation)
        # 设置精度,小数点2位
        doubleValidator.setDecimals(2)

        # 字符和数字
        reg = QRegExp('[a-zA-Z0-9]+$')  # 正则表达式
        validtor = QRegExpValidator(self)  # 传self原因同上
        validtor.setRegExp(reg)

        # 设置校验器
        intLineEdit.setValidator(intValidator)
        doubleLineEdit.setValidator(doubleValidator)
        validatorLineEdit.setValidator(validtor)

        self.setLayout(formLayout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QLineEditValidator()
    main.show()
    sys.exit(app.exec_())

课时34 使用掩码限制QLineEdit控件的输入

用掩码限制QLineEdit控件的输入

A:ASCII字母字符是必须输入的(A-Z、a-z)
a:ASCII字母字符是允许输入的,但不是必需的(A-Z、a-z)
N:ASCII字母字符是必须输入的(A-Z、a-z、0-9)
n:ASCII字母字符是允许输入的,但不是必需的(A-Z. a-z、0-9)
X:任何字符都是必须输入的
x:任何字符都是允许输入的,但不是必需的
9:ASCII数字字符是必须输入的(0-9)
0:ASCII数字字符是允许输入的,但不是必需的(0-9)
D:ASCII数字字符是必须输入的(1-9)
d:ASCII数字字符是允许输入的,但不是必需的(1-9)
#:ASCII数字字符或加减符号是允许输入的,但不是必需的
H:十六进制格式字符是必须输入的(A-F、a-f、0-9)
h:十六进制格式字符是允许输入的,但不是必需的(A-F、a-f、0-9)
B:二进制格式字符是必须输入的(0, 1)
b:二进制格式字符是允许输入的,但不是必需的(0, 1)
>:所有的字母字符都大写

<:所有字母字符都小写

!:关闭大小写转换

\:使用"\"转义上面列出的字符
# @CSDN王家视频教程图书馆
# @Time 2022/11/23 15:26
import sys
from PyQt5.QtWidgets import *


class QLineEditMask(QWidget):
    def __init__(self):
        super(QLineEditMask, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('用掩码限制QLineEdit控件的输入')
        formLayout = QFormLayout()

        ipLineEdit = QLineEdit()  # ip地址
        macLineEdit = QLineEdit()  # MAC地址
        dateLineEdit = QLineEdit()  # 日期
        licenseLineEdit = QLineEdit()  # 验证码

        #192.168.21.45
        # 最后加个分号和_意为没输入是默认显示_ ,前面的都是掩码,即ASCII数字字符是允许输入的,但不是必需的(0-9)
        ipLineEdit.setInputMask('000.000.000.000;_')
        macLineEdit.setInputMask('HH:HH:HH:HH:HH:HH;_')
        dateLineEdit.setInputMask('0000-00-00')
        licenseLineEdit.setInputMask('>AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#')  # 若没有输入显示井号

        formLayout.addRow('数字掩码', ipLineEdit)
        formLayout.addRow('MAC掩码', macLineEdit)
        formLayout.addRow('日期掩码', dateLineEdit)
        formLayout.addRow('许可证掩码', licenseLineEdit)

        self.setLayout(formLayout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QLineEditMask()
    main.show()
    sys.exit(app.exec_())

课时35 QLineEdit综合案例

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 15:37
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt
import sys


class QLine_comprehensive_case(QWidget):
    def __init__(self):
        super(QLine_comprehensive_case, self).__init__()
        self.initUI()

    def initUI(self):
        '''
        控件定义及属性设置
        '''
        edit1 = QLineEdit()
        # int校验器
        edit1.setValidator(QIntValidator())
        # 设置最大位数为4位,即不超过9999
        edit1.setMaxLength(4)
        # 右对齐
        edit1.setAlignment(Qt.AlignRight)
        # 这个字号直接影响输入框的尺寸
        edit1.setFont(QFont('Arial', 18))

        edit2 = QLineEdit()
        edit2.setValidator(QDoubleValidator(0.99, 99.99, 2))  # 2是精度,即小数点后几位

        edit3 = QLineEdit()
        edit3.setInputMask('99_9999_999999;#')

        edit4 = QLineEdit()
        edit4.textChanged.connect(self.textChanged)  # 绑定信号和槽

        edit5 = QLineEdit()
        edit5.setEchoMode(QLineEdit.Password)
        edit5.editingFinished.connect(self.enterPress)  # 绑定信号和槽

        edit6 = QLineEdit('Hello Pyqt5!')
        edit6.setReadOnly(True)  # 只读

        '''
        将控件添加到表单
        '''
        formlayout = QFormLayout()
        formlayout.addRow('整数校验', edit1)
        formlayout.addRow('浮点数校验', edit2)
        formlayout.addRow('input mask', edit3)
        formlayout.addRow('文本变化', edit4)
        formlayout.addRow('密码', edit5)
        formlayout.addRow('只读', edit6)

        '''
        设置主窗口属性
        '''
        self.setLayout(formlayout)
        self.setWindowTitle('QLineEdit综合案例')

    '''
    槽函数
    '''

    def textChanged(self, text):
        print('输入的内容' + text)

    def enterPress(self):
        print('已输入值')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QLine_comprehensive_case()
    main.show()
    sys.exit(app.exec_())

课时36 使用QTextEdit控件输入多行文本

 

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 16:30
from PyQt5.QtWidgets import *
import sys


class QTextEditDemo(QWidget):
    def __init__(self):
        super(QTextEditDemo, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QTextEdit控件演示')
        self.resize(300, 320)

        # 定义控件
        self.textEdit = QTextEdit()
        self.buttonText = QPushButton('显示文本')
        self.buttonHTML = QPushButton('显示HTML')
        self.buttonToText = QPushButton('获取文本')
        self.buttonToHTML = QPushButton('获取HTML')

        # 垂直布局
        layout = QVBoxLayout()
        layout.addWidget(self.textEdit)
        layout.addWidget(self.buttonText)
        layout.addWidget(self.buttonHTML)
        layout.addWidget(self.buttonToText)
        layout.addWidget(self.buttonToHTML)

        # 绑定信号和槽
        self.buttonText.clicked.connect(self.onClick_buttonText)
        self.buttonHTML.clicked.connect(self.onClick_buttonHTML)
        self.buttonToText.clicked.connect(self.onClick_buttonToText)
        self.buttonToHTML.clicked.connect(self.onClick_buttonToHTML)

        self.setLayout(layout)

    # 槽函数
    def onClick_buttonText(self):
        # 普通文本
        self.textEdit.setPlainText('Hello World!')

    def onClick_buttonHTML(self):
        # 富文本(HTML)
        self.textEdit.setHtml('<font color="blue" size="5">Hello World</font>')

    def onClick_buttonToText(self):
        print(self.textEdit.toPlainText())  # 控制台输出普通文本

    def onClick_buttonToHTML(self):
        print(self.textEdit.toHtml())  # 控制台输出HTML文本


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QTextEditDemo()
    main.show()
    sys.exit(app.exec_())

课时37 按钮控件(QpushButton)

QAbstractButton(所有按钮控件的父类)
QPushButton(普通按钮)
AToolButton(工具条按钮)
QRadioButton(单选框按钮)
QCheckBox(复选框按钮)

 

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 16:47

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class QPushButtonDemo(QDialog):
    def __init__(self):
        super(QPushButtonDemo, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QPushButton Demo')
        self.resize(350, 200)

        layout = QVBoxLayout()  # 垂直布局

        self.btn1 = QPushButton('第一个按钮')
        self.btn1.setText('First Button1')
        # 下面两句配合使用,功能类似于单选框按钮QCheckBox
        self.btn1.setCheckable(True)
        self.btn1.toggle()  # 按一下就按下去了,再按一下才能抬起
        # btn1一个信号对应两个槽函数
        self.btn1.clicked.connect(self.buttonState)  # 先绑定谁系统就先调用谁
        self.btn1.clicked.connect(lambda: self.whichButton(self.btn1))

        layout.addWidget(self.btn1)
        # 在文本前面显示图像
        self.btn2 = QPushButton('图像按钮')
        self.btn2.setIcon(QIcon(QPixmap('./and.png')))
        self.btn2.clicked.connect(lambda: self.whichButton(self.btn2))
        layout.addWidget(self.btn2)

        self.btn3 = QPushButton('不可用的按钮')
        self.btn3.setEnabled(False)
        layout.addWidget(self.btn3)

        self.btn4 = QPushButton('&MyButton')  # 设置了热键M/m
        self.btn4.setDefault(True)  # 如果没有任何按钮被选中,那么按回车就是按了这个按钮
        self.btn4.clicked.connect(lambda: self.whichButton(self.btn4))
        layout.addWidget(self.btn4)

        self.setLayout(layout)

    '''
    注意下面的方法是两个参数,如果用传统的信号与槽连接方式的话,只会将按钮对象本身传入,那样的话第二个参数就没有传入值了
    所以要用lambda表达式,当前对象直接调用这个函数,传入的值就对应第二个参数了
    '''

    def whichButton(self, btn):
        # self.sender() #通过此方法可得到是哪个按钮被按下,或者可用此方法中的传参方法
        print('被单击的按钮是<' + btn.text() + '>')

    def buttonState(self):
        if self.btn1.isChecked():
            print('按钮1已经被选中')
        else:
            print('按钮1未被选中')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QPushButtonDemo()
    main.show()
    sys.exit(app.exec_())

单选按钮控件QRatioButton

在一个容器内的单选按钮是互斥的,即选中了一个单选按钮,就不能再选中另一个单选按钮,也就是不能同时处于选中状态。在不同容器中的单选按钮是分开的,互不影响。

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 17:12
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class QRatioButtonDemo(QWidget):
    def __init__(self):
        super(QRatioButtonDemo, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QRatioButton')
        self.resize(350, 100)
        # 水平布局
        layout = QHBoxLayout()

        self.btn1 = QRadioButton('单选按钮1')
        # 设为默认是选中状态
        self.btn1.setChecked(True)
        # toggled是状态切换的信号
        self.btn1.toggled.connect(self.buttonState)
        layout.addWidget(self.btn1)

        self.btn2 = QRadioButton('单选按钮2')
        self.btn2.toggled.connect(self.buttonState)
        layout.addWidget(self.btn2)

        self.setLayout(layout)

    def buttonState(self):
        ratiobtn = self.sender()
        if ratiobtn.isChecked() == True:
            print('<' + ratiobtn.text() + '>被选中')
        else:
            print('<' + ratiobtn.text() + '>被取消选中状态')
        # 同一容器下单选按钮是互斥的,所以不必利用ratiobtn.text()来分情况判断
        '''
        if ratiobtn.text()=='单选按钮1':
            #是否被选中
            if ratiobtn.isChecked()==True:
                print('<'+ratiobtn.text()+'>被选中')
            else:
                print('<'+ratiobtn.text()+'>被取消选中状态')
        if ratiobtn.text()=='单选按钮2':
            if ratiobtn.isChecked()==True:
                print('<'+ratiobtn.text()+'>被选中')
            else:
                print('<'+ratiobtn.text()+'>被取消选中状态')
        '''


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QRatioButtonDemo()
    main.show()
    sys.exit(app.exec_())

课时39 复选框控件QCheckBox

3种状态:

未选中:0

半选中:1

选中:2

tristate属性表示复选框是三种状态还是两种状态,如果tristate为true,则表示复选框中有选中,半选中,未选中三种状态,即setTristate(True)即表示允许半选中。
# @CSDN王家视频教程图书馆
# @Time 2022/11/23 17:39

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtCore import Qt  # 其中有许多常量


class QCheckBoxDemo(QWidget):
    def __init__(self):
        super(QCheckBoxDemo, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QCheckBoxDemo')
        self.resize(350, 100)
        layout = QHBoxLayout()

        self.checkbox1 = QCheckBox('复选框控件1')
        # 默认选中
        self.checkbox1.setChecked(True)  # 此函数只有两种状态
        self.checkbox1.stateChanged.connect(lambda: self.checkboxState(self.checkbox1))
        layout.addWidget(self.checkbox1)

        self.checkbox2 = QCheckBox('复选框控件2')
        self.checkbox2.stateChanged.connect(lambda: self.checkboxState(self.checkbox2))
        layout.addWidget(self.checkbox2)

        self.checkbox3 = QCheckBox('半选中控件3')
        # 设置选中有三个状态(即允许半选中)
        self.checkbox3.setTristate(True)
        # setCheckState函数有三种状态:Unchecked,PartiallyChecked,Checked
        self.checkbox3.setCheckState(Qt.PartiallyChecked)
        self.checkbox3.stateChanged.connect(lambda: self.checkboxState(self.checkbox3))
        layout.addWidget(self.checkbox3)

        self.setLayout(layout)

    def checkboxState(self, cb):
        check1Status = self.checkbox1.text() + ',isChecked=' + str(self.checkbox1.isChecked()) + ',isCheckstate=' + str(
            self.checkbox1.checkState()) + '\n'
        check2Status = self.checkbox2.text() + ',isChecked=' + str(self.checkbox2.isChecked()) + ',isCheckstate' + str(
            self.checkbox2.checkState()) + '\n'
        check3Status = self.checkbox3.text() + ',isChecked=' + str(self.checkbox3.isChecked()) + ',isCheckstate' + str(
            self.checkbox3.checkState()) + '\n'
        print(check1Status + check2Status + check3Status)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QCheckBoxDemo()
    main.show()
    sys.exit(app.exec_())

 课时40 下拉列表控件QComboBox

1 如何将列表项添加到QComboBox控件中

2 如何获取选中的列表项

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 17:56

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtCore import Qt  # 其中有许多常量


class QComboBoxDemo(QWidget):
    def __init__(self):
        super(QComboBoxDemo, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QComboBoxDemo')
        self.resize(350, 100)
        # 垂直布局
        layout = QVBoxLayout()

        self.label = QLabel('请选择编程语言')
        self.cb = QComboBox()
        self.cb.addItem('JavaEE')
        self.cb.addItem('Uniapp')
        self.cb.addItems(['Python', '大数据', '区块链'])
        # 每一项都对应一个下标索引
        self.cb.currentIndexChanged.connect(self.selectionChange)  # 此信号默认传递两个参数(控件本身,索引)

        layout.addWidget(self.label)
        layout.addWidget(self.cb)

        self.setLayout(layout)

    def selectionChange(self, i):
        # 标签会随着当前选中的下拉项而改变
        self.label.setText(self.cb.currentText())
        self.label.adjustSize()

        for j in range(self.cb.count()):
            print('item' + str(j) + '=' + self.cb.itemText(j))

        print('current index', i, 'selection changed', self.cb.currentText())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QComboBoxDemo()
    main.show()
    sys.exit(app.exec_())

 课时41 滑块控件QSlider

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 18:20
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt  # 其中有许多常量


class QSliderDemo(QWidget):
    def __init__(self):
        super(QSliderDemo, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('QSlider演示')
        self.resize(350, 500)
        # 垂直布局
        layout = QVBoxLayout()

        self.label = QLabel('Hello PyQt5!')
        self.label.setAlignment(Qt.AlignCenter)
        layout.addWidget(self.label)

        # 滑块分为水平和垂直两种
        # 水平slider1
        self.slider1 = QSlider(Qt.Horizontal)  # 水平,左右滑动
        # 设置最小值
        self.slider1.setMinimum(12)
        # 设置最大值
        self.slider1.setMaximum(48)
        # 步长
        self.slider1.setSingleStep(3)
        # 设置当前值
        self.slider1.setValue(18)
        # 设置刻度的位置,刻度在下方
        self.slider1.setTickPosition(QSlider.TicksBelow)
        # 刻度间隔
        self.slider1.setTickInterval(6)
        self.slider1.valueChanged.connect(self.valueChange)

        # 垂直slider2
        self.slider2 = QSlider(Qt.Vertical)  # 垂直滑块
        self.slider2.setMinimum(1)
        self.slider2.setMaximum(80)
        self.slider2.setSingleStep(5)
        self.slider2.setTickPosition(QSlider.TicksLeft)  # 刻度条放在滑块的左边
        self.slider2.setTickInterval(10)
        self.slider2.valueChanged.connect(self.valueChange)

        layout.addWidget(self.slider1)
        layout.addWidget(self.slider2)
        self.setLayout(layout)

    def valueChange(self):
        '''
        注意这里是sender(),而不是slider1也不是slider2,sender()获取当前操作的控件,
        这样无论拖动哪个滑动条字体大小都会变化,因为这俩信号对应这一个槽函数
        '''
        print('当前值:%s' % self.sender().value())
        size = self.sender().value()  # 获得当前值
        # 使字号根据当前值来变化
        self.label.setFont(QFont('Arial', size))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QSliderDemo()
    main.show()
    sys.exit(app.exec_())

课时42 计数器控件QSpinBox

 

# @CSDN王家视频教程图书馆
# @Time 2022/11/23 18:34
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt  # 其中有许多常量


class QSpinBoxDemo(QWidget):
    def __init__(self):
        super(QSpinBoxDemo, self).__init__()
        self.initUI()

    def initUI(self):
        ####################################### 窗口设置
        self.setWindowTitle('QSliderDemo')
        self.resize(350, 120)
        # 垂直布局
        layout = QVBoxLayout()
        ########################################   控件
        self.label = QLabel('当前值')
        self.label.setAlignment(Qt.AlignCenter)

        self.sb = QSpinBox()
        # 默认值
        self.sb.setValue(18)
        # 设置范围
        self.sb.setRange(10, 38)
        # 设置步长
        self.sb.setSingleStep(3)
        ####################################### 信号与槽
        self.sb.valueChanged.connect(self.valueChange)

        #######################################  组装
        layout.addWidget(self.label)
        layout.addWidget(self.sb)
        self.setLayout(layout)

    def valueChange(self):
        self.label.setText('当前值:' + str(self.sb.value()))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QSpinBoxDemo()
    main.show()
    sys.exit(app.exec_())

课时43 对话框: QDialog

 

QMessageBox    消息对话框
QColorDialog      颜色对话框
QFileDialog        文件对话框
QFontDia log      字体对话框
QInputDialog      输入对话框(获取输入信息)

 

消息对话框 QMessageBox

主要用于显示软件的版本和作者及其他和软件息息相关的信息

常用的消息对话框:

1.关于对话框
2.错误对话框
3.警告对话框
4.提问对话框
5.消息对话框


有2点差异
1.显示的对话框图标可能不同
2.显示的按钮是不一样的

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

城市路边停车收费系统/停车收费管理系统

摘 要 近年来&#xff0c;随着社会的进步和发展&#xff0c;车辆也在迅速增加&#xff0c;城市交通的瓶颈不仅体现在道路交通的拥挤上&#xff0c;也体现在传统停车场管理效率和安全性大大滞后于社会的需要&#xff0c;给人们的生活带来了极大的不便。尤其&#xff0c;随着汽车…

二、MongoDB简介及基本操作

mongodb是一个基于文档的强大、灵活、易于扩展的通用型数据库。是基于分布式文件存储的数据库。其由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 mongodb也是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&…

运动健身买什么耳机好用、最优秀的健身耳机推荐分享

冬天绝对是个减肥的好季节&#xff0c;因为这个季节天气比较冷&#xff0c;我们在运动过程中消耗的热量也就会更多&#xff0c;因此选择一款不错的运动耳机来用坚持就显得尤为重要了。这款运动耳机要能稳定在耳朵上&#xff0c;还要具备防水功能&#xff0c;同时音质上也要有保…

闲人闲谈PS之三十四——项目成本费用控制阈值

**惯例闲话&#xff1a;**最近有小伙伴问闲人有没有PS顾问资源&#xff0c;闲人问了一圈&#xff0c;结果发现都没有档期&#xff0c;不免让闲人有些失落&#xff0c;好心答应帮忙&#xff0c;结果帮不上…但是隐隐约约觉得在几年前说的话被应验了&#xff0c;PS模块一定是个热…

Ubuntu G++ 编译C++源文件

工程项目代码简短的时候使用 G 进行功能模块测试 过程分为&#xff1a; 预处理&#xff1a;展开头文件&#xff0c;去掉主食&#xff0c;条件编译和文件包含编译&#xff1a;检查语法&#xff0c;生成汇编代码汇编&#xff1a;汇编代码转换成机器码链接&#xff1a;Link 主要是…

王学岗音视频开发(一)—————配置NDK开发环境

Android studio准备 Android studio需要下载Android6.0版本(Android SDK Platform 23)&#xff0c;最小支持Android6.0 NDK 下载 cmake下载安装 Android studio 代理配置 dl.google.com可能会被屏蔽&#xff0c;首先查下其IP地址。查到IP地址后修改etc/hosts文件。 Andr…

pytorch深度学习实战lesson25

第二十五课 network in network(NIN) NIN 叫做network in network或者叫做网络中的网络。这个网络现在用的不多&#xff0c;几乎很少被用到。但是它里面提出了比较重要的概念&#xff0c;在之后很多网络都会被持续的用到。所以今天认识一下这一个网络。 目录 理论部分 实践部…

高并发下丢失更新的解决方案

作者&#xff1a;谢益培 1 背景 关键词&#xff1a;并发、丢失更新 预收款账户表上有个累计抵扣金额的字段&#xff0c;该字段的含义是统计商家预收款账户上累计用于抵扣结算成功的金额数。更新时机是&#xff0c;账单结算完成时&#xff0c;更新累计抵扣金额累计抵扣金额账…

ImmunoChemistry艾美捷Annexin V-FITC细胞凋亡检测试剂盒方案

膜联蛋白V是具有血管抗凝血活性的钙和磷脂结合蛋白家族的成员。体外实验结果表明&#xff0c;它可能通过与凝血酶原竞争磷脂酰丝氨酸&#xff08;PS&#xff09;结合位点而在抑制凝血中发挥作用。在健康细胞中&#xff0c;PS通常保存在细胞膜的内小叶&#xff08;胞质侧&#x…

网络是怎样连接的--TCP大致控制流程

文章目录5.1 协议栈内部结构5.2 套接字作用5.3 创建套接字5.4 两类控制信息5.5 连接操作的实际过程5.6 收发数据5.6.1将http请求消息发给协议栈5.6.2 注意对较大数据进行拆分5.6.3 序号和ACK5.6.4 等待超时时间5.6.5 窗口机制提升效率5.6.6 ACK与窗口合并5.7 断开连接5.8 删除套…

MCE | 新冠 德尔塔病毒

冠状病毒&#xff0c;其表面有突出的棒状尖峰&#xff0c;在电镜下可以观察到像王冠一样的放射状凸起而得名。冠状病毒的基本结构如图 1 所示&#xff0c;包括刺突糖蛋白 (S)、包膜 (E)、膜 (M) 和核衣壳 (N)。 图 1. 冠状病毒结构2020 年石正丽教授在 Nature 发表的论文 A …

浅识JVM

⭐️前言⭐️ 本篇文章&#xff0c;博主分享的是在面试中JVM常考的考点&#xff0c;希望这篇文章能够对你有用。 &#x1f349;博客主页&#xff1a; &#x1f341;【如风暖阳】&#x1f341; &#x1f349;精品Java专栏【JavaSE】、【备战蓝桥】、【JavaEE初阶】、【MySQL】、…

多维度比对三种软件开发方式后,无代码开发到底赢在哪?

近年来受信息化、数字化和 5G、云计算发展的影响&#xff0c;以及企业管理的不确定性和复杂性增加&#xff0c;国内管理软件的需求及行业市场整体规模也连年高速增长&#xff0c;进而带动了管理软件开发方式的变革。 但是由于传统自主及外包开发方式存在的周期长、成本高、不能…

DataX二次开发——(9)新增s3reader和s3writer模块

1 背景 DataX3.0支持阿里的OSS的读写&#xff0c;但没支持S3的读写&#xff0c;虽然OSS的也是基于S3协议去做二开的&#xff0c;但是一些参数有点区别&#xff0c;所以按照阿里的OSSReader和OSSWriter开发了S3Reader和S3Writer。 2 代码开发 2.1 s3reader 2.1.1 项目结构 2…

pytorch快速上手(8)-----pytorch优化器简介

文章目录一、简介二、optimizer属性方法1. zero_grad()2. step()3. add_param_group()4. state_dict()5. load_state_dict()学习率动量三、常见优化器介绍1. BGD&#xff08;Batch Gradient Descent&#xff09;2. Stochastic Gradient Descent&#xff08;SGD&#xff09;3. M…

记录一次因执行时间过长锁已经释放导致finally块再次unlock引发的异常

一、前言 因为我的一个需求需要请求一个耗时比较长的接口&#xff08;耗时长其实是对接方的锅&#xff09;&#xff0c;该接口交给了Spring事务管理&#xff0c;并且使用了分布式锁&#xff0c;但是在请求的时候&#xff0c;出现error,看日志发现是unlock的时候没有锁可以去解…

牛客网语法篇练习复合类型(二)

1.输入NxM矩阵&#xff0c;矩阵元素均为整数&#xff0c;计算其中大于零的元素之和。 a,b map(int,input().split()) list1 [] sum 0 for i in range(a):list1.extend(list(map(int,input().split()))) for i in list1:if i>0:sumi print(sum) 2.给你一个整数n&#xff…

辨别代码能否引发线程安全问题--避免在平时写代码时引发线程安全问题

前景提要&#xff1a; 本篇文章只是入门&#xff0c;目的在于在脑海中构建一个Java运行的模型&#xff0c;然后可以在平时写代码时对是否引发线程安全问题有感知。 文章目录引入了解辨别线程安全问题之前先来构建一个计算机运行模型了解线程安全问题怎么能不知道线程和进程了解…

搭建repo服务器管理多个git工程

参考自&#xff1a;搭建repo服务器管理多个git工程     repo系列讲解 —— Android系统源码(AOSP)下载 1、repo介绍 Android使用git作为代码管理工具&#xff0c;开发了gerrit进行代码审核&#xff0c;以便更好的对代码进行集中式管理。还开发了repo命令行工具&#xff0…

MySQL8.0 binlog进阶

MySQL8.0经过这几年的操揉磨治&#xff0c;已经上升到海平面了。其中binlog也悄然无声带来了不一样的变化。高可用核心复制基础binlog变化更应该进一步了解。从参数入手&#xff0c;了解带来的变化。 slave回放算法 slave_rows_search_algorithms 当使用基于 row-based复制格…