14. python从入门到精通——GUI编程-程序员宅基地

技术标签: python  UI  PyQt  开发语言  

目录

常用的GUI框架

wxPython:比较常用

PyQt6:比较常用

Kivy

Flexx

Tkinter

安装PyQt5

要开发PyQt5程序需要安装三个模块:

安装

安装命令:

window安装:

PyCharm软件安装:      

PyCharm软件配置PyQt5及代码转换工具    

配置PyQt5

配置代码转换工具

使用Qt Designer 创建窗口

在Qt Designer主要有三种类型的窗口:

创建主窗口步骤

PyQt5 信号与槽        

信号与PyQt5内置的槽函数链接

信号与制定的槽函数链接

Label:标签控件

设置文本的两种方法:

设置文本对齐方式的两种方法:

设置文本换行显示

设置超链接

设置显示图片

获取标签文本

LineEdit控件:单行文本框

常用方法:

常用信号:

TextEdit控件:多行文本框

常用方法:

PushButton控件:按钮

常用方法:

常用新型号:

CheckBox:复选框

复选框有三种状态:

RadioButton:单选按钮

常用方法:

常用信号:

ComboBox:下拉组合框

常用方法:

常用信号:


GUI(图形用户界面)三个基本要素:输入、处理、输出

常用的GUI框架

  • wxPython:比较常用

    官网

    wxPython 是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能键全的 GUI 用户界面。

    wxPython也是一款开源软件,并且具有非常优秀的跨平台能力,能够运行在32位windows、绝大多数的Unix或类Unix系统、Macintosh OS X上。

  • PyQt6:比较常用

    官网

    Qt是c++编写的GUI库,而PyQt则是Qt库的python版本,支持跨平台

  • Kivy

    Kivy是一个开源工具包,能够让使用相同源代码创建的程序能跨平台运行。这个框架是事件驱动的,基于主循环,非常适合开发游戏。

  • Flexx

    Flexx 是一个纯 Python 工具包,用来创建图形化界面应用程序。其使用 Web 技术进行界面的渲染。你可以用 Flexx 来创建桌面应用,同时也可以导出一个应用到独立的 HTML 文档。因为使用纯 Python 开发,所以 Flexx 是跨平台的。

Tkinter

   TKinter是Tk图形用户界面工具包标准的python接口。Tk是一个轻量级的跨平台图形用户界面(GUI开发工具),同时也是python内置模块。

缺点:GUI界面颜值低,一些控件不齐全并且文档不是很健全

安装PyQt5

要开发PyQt5程序需要安装三个模块:

        pyqt5

        pyqt5-tools (自带英文版UI编辑器)

        pyqt5designer (此包是中文版的UI编辑器可以不安装)

安装

安装命令:

        pip install 模块名 [-i 镜像地址]

            #由于默认镜像地址指向国外官网所以网速很慢,所以一般要制定国内镜像地址

window安装:

        搜索框输入cmd然后右击以管理员身份打开(由于windos安全性比较高,为防止安装时权限问题最好以管理员方式安装)

        pip install  pyqt5 pyqt5-tools pyqt5designer -i https://pypi.tuna.tsinghua.edu.cn/simple #此方法全系统生效

PyCharm软件安装:      

注意:PyCharm软件上安装默认只能在所在项目生效

安装前需要在控制台软件包按钮设置下python镜像源地址

安装PyQt5

 

PyCharm软件配置PyQt5及代码转换工具    

配置PyQt5

打开PyCharm左上角文件→设置窗口

        #D:\Python\Lib\site-packages目录下是所有已安装的包

        #$ProjectFileDir$:项目文件目录

 

配置代码转换工具

  • 其实就是配置一条python命令,可以把设计好的ui文件转换为python代码:

            -m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py

                $ProjectFileDir$:表示文件所在的项目路径。
                $FileDir$:表示文件所在的路径。
                $FileName$:表示文件名(不带路径)。
                $FileNameWithoutExtension$:表示没有扩展名的文件名。

  •  使用转换工具时先选中要进行转换的UI文件然后点击配置的转换工具会自动转换成.py文件:

            实际执行的转换命令:D:\Python\python.exe -m PyQt5.uic.pyuic untitled.ui -o untitled.py

-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py

使用Qt Designer 创建窗口

在Qt Designer主要有三种类型的窗口:

        Main Window:主窗口,主要为用户提供一个有工具栏菜单栏和状态栏的窗口

        Widget:通用窗口

        Dialog:对话框,主要是用来执行一些短期的任务或者与用户交互的时候

创建主窗口步骤

  1. 创建主窗口
  2. 设计主窗口
  3. 预览窗口效果
  4. 查看python代码
  5. .ui转换为,py
  6. 运行主窗口:为主窗口编写程序入口以便运行主窗口

示例:主窗口python代码

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(256, 250)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(130, 30, 91, 20))
        self.textEdit.setObjectName("textEdit")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(70, 30, 54, 12))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(70, 70, 54, 12))
        self.label_2.setObjectName("label_2")
        self.textEdit_2 = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit_2.setGeometry(QtCore.QRect(130, 70, 91, 20))
        self.textEdit_2.setObjectName("textEdit_2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(90, 120, 75, 23))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 256, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "用户名"))
        self.label_2.setText(_translate("MainWindow", "密码"))
        self.pushButton.setText(_translate("MainWindow", "登录"))

if __name__ == '__main__':
   import sys
   app = QtWidgets.QApplication(sys.argv) #创建app对象
   MainWindow = QtWidgets.QMainWindow() # 创建窗体对象
   ui = Ui_MainWindow() # 创建PyQt设计的窗体对象
   ui.setupUi(MainWindow) # 调用PyQt窗体的方法对窗体对象进行初始化设置
   MainWindow.show() # 显示窗体
   sys.exit(app.exec_()) # 程序关闭时退出进程

PyQt5 信号与槽        

信号与槽是PyQt5最核心的一个机制,也是PyQt5编程的时候对线之间通信的一个基础

        PyQt5中需要信号与槽之间进行连接来实现各种操作

        在PyQt5中每一个QObject对象都支持信号与槽的机制

        信号:相当于事件,例如鼠标事件、键盘事件

        槽:相当于函数

信号与槽机制实现的原理:

        首先发送者把信号发送给接受者

        发送的过程中中间需要一些协议进行连接,连接使用的是connect()方法

        接收者在接收到信号之后需要调用指定的槽函数来进行执行以实现相应的功能

信号与PyQt5内置的槽函数链接

演示:添加一个按钮,在单击按钮时通过关联内置的close()槽函数 关闭窗口

最后进行预览并保存和转换为.py文件执行测试,转换时会覆盖之前的同名.py文件,需要重新添加程序入口

代码示例 

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(559, 411)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(170, 110, 81, 41))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(170, 180, 51, 31))
        self.label_2.setObjectName("label_2")
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(250, 110, 121, 41))
        self.textEdit.setObjectName("textEdit")
        self.textEdit_2 = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit_2.setGeometry(QtCore.QRect(250, 180, 121, 41))
        self.textEdit_2.setObjectName("textEdit_2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(210, 240, 111, 41))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(220, 310, 91, 41))
        self.pushButton_2.setObjectName("pushButton_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 559, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.pushButton_2.clicked.connect(MainWindow.close) # type: ignore
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "账号"))
        self.label_2.setText(_translate("MainWindow", "密码"))
        self.pushButton.setText(_translate("MainWindow", "登陆"))
        self.pushButton_2.setText(_translate("MainWindow", "关闭"))

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()  # 创建窗体对象
    ui = Ui_MainWindow()  # 创建PyQt设计的窗体对象
    ui.setupUi(MainWindow)  # 调用PyQt窗体的方法对窗体对象进行初始化设置
    MainWindow.show()  # 显示窗体
    sys.exit(app.exec_())  # 程序关闭时退出进程

在代码中表现为: self.pushButton_2.clicked.connect(MainWindow.close)

        #表示pushButton这个按钮他的clicked这个信号链接到了当前窗口的close,通过这行代码就实现了单击关闭按钮时就关闭了当前窗口

信号与制定的槽函数链接

注意:关联槽函数的时候只需要写函数的名称,不要给写括号或传参数

代码示例: 

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(559, 411)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(170, 110, 81, 41))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(170, 180, 51, 31))
        self.label_2.setObjectName("label_2")
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(250, 110, 121, 41))
        self.textEdit.setObjectName("textEdit")
        self.textEdit_2 = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit_2.setGeometry(QtCore.QRect(250, 180, 121, 41))
        self.textEdit_2.setObjectName("textEdit_2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(210, 240, 111, 41))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(220, 310, 91, 41))
        self.pushButton_2.setObjectName("pushButton_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 559, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.pushButton_2.clicked.connect(self.showinfo) # type: ignore
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "账号"))
        self.label_2.setText(_translate("MainWindow", "密码"))
        self.pushButton.setText(_translate("MainWindow", "登陆"))
        self.pushButton_2.setText(_translate("MainWindow", "关闭"))

    def showinfo(self):
        print("自定义槽函数")

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()  # 创建窗体对象
    ui = Ui_MainWindow()  # 创建PyQt设计的窗体对象
    ui.setupUi(MainWindow)  # 调用PyQt窗体的方法对窗体对象进行初始化设置
    MainWindow.show()  # 显示窗体
    sys.exit(app.exec_())  # 程序关闭时退出进程

Label:标签控件

Label控件:对应的是PyQt5里面的QLabel类,本质上是这个类的一个对象。主要用来显示用户不能编辑的文本,或者用来标识窗体上的对象

大部分的属性都可以在QT的UI编辑器的属性栏中的text属性三点号按钮中进行编辑

设置文本的两种方法:

        (1)在QT的UI编辑器中选中label,然后找到右边属性栏中的text属性进行编辑

                        

        (2)在python代码中的初始化函数中添加 self.label.setText()

设置文本对齐方式的两种方法:

(1)在QT的UI编辑器中选中label,然后找到右边属性栏中的alignment属性进行编辑

(2)在python代码中的初始化函数中添加 self.label.setAlignment()

 

设置文本换行显示

(1)在QT的UI编辑器中选中label,然后找到右边属性栏中的wordWrap属性进行编辑

 (2)在python代码中的初始化函数中添加 self.label.setWordWrap()

设置超链接

(1)在QT的UI编辑器中选中label,然后找到右边属性栏中的Text属性和OpenExternalLinks属性进行编辑

 

(2)在python代码中的初始化函数中添加setText()和setOpenExternalLinks()结合使用

设置显示图片

现在本地项目中放入图片

在python代码中的初始化函数中

先导入from PyQt5.QtGui import QPixmap 类

在添加self.label.setPixmap(QPixmap("tupian.gif"))方法

获取标签文本

在python代码中的初始化函数中添加text()方法,执行后会在控制台中获取到相应文本(需要先把图片注释掉)

代码示例:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '5.1.ui'
#
# Created by: PyQt5 UI code generator 5.13.2
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(376, 231)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(30, 30, 314, 81))
        self.label.setText("用户名:")

        # 设置文本对齐方式
        self.label.setAlignment(QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)

        # 设置图片
        from PyQt5.QtGui import QPixmap # 导入QPixmap类
        self.label.setPixmap(QPixmap('test.png')) # 为label设置图片


        # # 设置长文本,并换行显示
        # self.label.setText("每天编程1小时,从菜鸟到大牛")
        # self.label.setWordWrap(True)

        self.label.setTextFormat(QtCore.Qt.AutoText)
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 336, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        print(self.label.text()) # 获取Label的文本

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


import sys
# 主方法,程序从此处启动PyQt设计的窗体
if __name__ == '__main__':
   app = QtWidgets.QApplication(sys.argv)
   MainWindow = QtWidgets.QMainWindow() # 创建窗体对象
   ui = Ui_MainWindow() # 创建PyQt设计的窗体对象
   ui.setupUi(MainWindow) # 调用PyQt窗体的方法对窗体对象进行初始化设置
   MainWindow.show() # 显示窗体
   sys.exit(app.exec_()) # 程序关闭时退出进程

LineEdit控件:单行文本框

LineEdit控件:对应的是PyQt5中的QLineEdit这个类,表示只能输入单行文本。可以用在一些网站登录页面输入账号密码时的窗口

常用方法:

        setText():设置文本框的内容
        text():获取文本框的内容

        setEchoMode():设置文本框显示字符的模式有四种模式:

                Normal:默认模式,输入什么即显示什么

                Password:密码模式,一般是用小黑点覆盖你所输入的字符

                PasswordEchoOnEdit:编辑时输入字符显示输入内容,否则用小黑点代替

                NoEcho:何输入都看不见

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

        setFocus():获取鼠标焦点

        clear():清空文本框

        setMaxLength():设置文本框允许输入的最大长度

        setReadOnly():设置是否只读

        setValidator():设置文本的验证器,限制文本内容只能输入小数、整数、个数等可以结合正则表达式指定

常用信号:

textChanged:文本框内容正在改变时发射。例如淘宝上购买商品在修改数量时,总价格也会随之改变

editingFinished:编辑结束按回车键时发射

TextEdit控件:多行文本框

TextEdit:对应的是PyQt5中的QTextEdit这个类,主要用来输入多行的文本内容。当文本内容超出控件的显示范围时,这个控件就会自动显示垂直的滚动条,并支持显示html。

常用方法:

setPlainText():设置多行文本框的内容
toPlainText():获取多行文本框中的内容
setHtml():设置html文档内容
toHtml():获取html文档内容
clear():清空文本框的内容
setTextColor():设置文本框的颜色
setWordWrapMode():设置自动换行
setTextBackgroundColor():设置文本的背景颜色

PushButton控件:按钮

PushButton:对应的是QPushButton类,既可以显示文本也可以显示图像。

常用方法:

setText():设置要显示的文本
setIcon():设置按钮上所显示的图标
setEnabled():设置按钮是否可用
setIconSize():设置按钮上的图标大小
setShortcut():设置按钮的快捷键
text():获取按钮所显示的文本

常用新型号:

clicked:表示在单击按钮时发射执行信号

示例:点击登录图标按钮时弹出提示框,关闭时关闭窗口

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '5.7.ui'
#
# Created by: PyQt5 UI code generator 5.13.2
#
# WARNING! All changes made in this file will be lost!


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


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(225, 121)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(40, 83, 61, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.setIcon(QIcon(QPixmap("login.ico"))) # 为登录按钮设置图标
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(29, 22, 54, 12))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(29, 52, 54, 12))
        self.label_2.setObjectName("label_2")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(79, 18, 113, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(78, 50, 113, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)  # 设置文本框为密码
        self.lineEdit_2.setValidator(QtGui.QIntValidator(10000000, 99999999))  # 设置只能输入8位数字
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(120, 83, 61, 23))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_2.setIcon(QIcon(QPixmap("exit.ico")))  # 为退出按钮设置图标
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        # 为登录按钮的clicked信号绑定自定义槽函数
        self.pushButton.clicked.connect(self.login)
        # 为退出按钮的clicked信号绑定MainWindow窗口自带的close槽函数
        self.pushButton_2.clicked.connect(MainWindow.close)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def login(self):
        from PyQt5.QtWidgets import QMessageBox
        # 使用information()方法弹出信息提示框
        QMessageBox.information(MainWindow, "登录信息", "用户名:"+self.lineEdit.text()+"  密码:"+self.lineEdit_2.text(), QMessageBox.Ok)

    def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "系统登录"))
            self.pushButton.setText(_translate("MainWindow", "登录"))
            self.label.setText(_translate("MainWindow", "用户名:"))
            self.label_2.setText(_translate("MainWindow", "密  码:"))
            self.pushButton_2.setText(_translate("MainWindow", "退出"))

import sys
# 主方法,程序从此处启动PyQt设计的窗体
if __name__ == '__main__':
   app = QtWidgets.QApplication(sys.argv)
   MainWindow = QtWidgets.QMainWindow() # 创建窗体对象
   ui = Ui_MainWindow() # 创建PyQt设计的窗体对象
   ui.setupUi(MainWindow) # 调用PyQt窗体的方法对窗体对象进行初始化设置
   MainWindow.show() # 显示窗体
   sys.exit(app.exec_()) # 程序关闭时退出进程

CheckBox:复选框

CheckBox:对应的是QCheckBox类,表示可以选择多个。使用场景例如QQ登录时可以自动登录和记住密码;数据库权限设置时可以选择多种权限等

复选框有三种状态:

QT.Checked:选中

QT.Unchecked:未选中

QT.PartiallyChecked:半选中状态,只选择一些项里面的某些项目

     注意:默认情况只有选中或未选中状态,如果需要有半选中状态需要setTristate() 进行特殊设置,并且通过setTristate()可以判断当前属于哪种状态

示例:点击设置按钮获取已经选取了那种权限

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '5.11.ui'
#
# Created by: PyQt5 UI code generator 5.13.2
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(211, 139)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox.setGeometry(QtCore.QRect(22, 19, 101, 16))
        self.checkBox.setObjectName("checkBox")
        self.checkBox_2 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox_2.setGeometry(QtCore.QRect(122, 19, 101, 16))
        self.checkBox_2.setObjectName("checkBox_2")
        self.checkBox_3 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox_3.setGeometry(QtCore.QRect(22, 49, 101, 16))
        self.checkBox_3.setObjectName("checkBox_3")
        self.checkBox_4 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox_4.setGeometry(QtCore.QRect(122, 49, 101, 16))
        self.checkBox_4.setObjectName("checkBox_4")
        self.checkBox_5 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox_5.setGeometry(QtCore.QRect(22, 78, 101, 16))
        self.checkBox_5.setObjectName("checkBox_5")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(120, 106, 75, 23))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        self.pushButton.clicked.connect(self.getvalue)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def getvalue(self):
        oper="" # 记录用户权限
        if self.checkBox.isChecked(): # 判断复选框是否选中
            oper+=self.checkBox.text() # 记录选中的权限
        if self.checkBox_2.isChecked():
            oper +='\n'+ self.checkBox_2.text()
        if self.checkBox_3.isChecked():
            oper+='\n'+ self.checkBox_3.text()
        if self.checkBox_4.isChecked():
            oper+='\n'+ self.checkBox_4.text()
        if self.checkBox_5.isChecked():
            oper+='\n'+ self.checkBox_5.text()
        from  PyQt5.QtWidgets import QMessageBox
        # 使用information()方法弹出信息提示,显示所有选择的权限
        QMessageBox.information(MainWindow, "提示", "您选择的权限如下:\n"+oper, QMessageBox.Ok)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "设置用户权限"))
        self.checkBox.setText(_translate("MainWindow", "基本信息管理"))
        self.checkBox_2.setText(_translate("MainWindow", "进货管理"))
        self.checkBox_3.setText(_translate("MainWindow", "销售管理"))
        self.checkBox_4.setText(_translate("MainWindow", "库存管理"))
        self.checkBox_5.setText(_translate("MainWindow", "系统管理"))
        self.pushButton.setText(_translate("MainWindow", "设置"))

import sys
# 主方法,程序从此处启动PyQt设计的窗体
if __name__ == '__main__':
   app = QtWidgets.QApplication(sys.argv)
   MainWindow = QtWidgets.QMainWindow() # 创建窗体对象
   ui = Ui_MainWindow() # 创建PyQt设计的窗体对象
   ui.setupUi(MainWindow) # 调用PyQt窗体的方法对窗体对象进行初始化设置
   MainWindow.show() # 显示窗体
   sys.exit(app.exec_()) # 程序关闭时退出进程

RadioButton:单选按钮

RadioButton:对应的是QRadioButton类,例如单选题或单选设置。

常用方法:

setText():设置单选按钮要显示的方法

setChecked()/setCheckable() :设置单选按钮是否为选中状态,True表示为选中状态

isChecked():获取单选按钮当前的选中状态,返回True表示为选中

text():获取单选按钮所显示的文本

常用信号:

clicked:在每次单击单选按钮时会发射,不管状态发布发生改变

toggled:状态发生改变时发射

ComboBox:下拉组合框

ComboBox:对应的是QComboBox类,主要时用来在下拉组合框里显示数据,例如在选择语言时下拉列表显示出各种语言提供选择

常用方法:

addItem():添加项
addItems():一次添加多项
setItemText():设置项的文本
count():获取所有选项的数量
currentText():获取当前选中项的文本
currentIndex():获取当前项的索引
itemText():获取索引为index项的文本
clear():删除所有的选项

常用信号:

activated:选中下拉选项时发射
currentIndexChanged:选中下拉选项的索引改变时发射

示例:把选中的下拉组合框中的内容显示在label控件中

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '5.12.ui'
#
# Created by: PyQt5 UI code generator 5.13.2
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(244, 97)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(30, 20, 41, 16))
        self.label.setObjectName("label")
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(70, 15, 141, 22))
        self.comboBox.setObjectName("comboBox")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(35, 56, 171, 16))
        self.label_2.setText("")
        self.label_2.setObjectName("label_2")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        # 定义职位列表
        list=["总经理", "副总经理", "人事部经理", "财务部经理", "部门经理", "普通员工" ]
        self.comboBox.addItems(list) # 将职位列表添加到ComboBox下拉列表中
        # 将ComboBox控件的选项更改信号与自定义槽函数关联
        self.comboBox.currentIndexChanged.connect(self.showinfo)

    def showinfo(self):
        self.label_2.setText("您选择的职位是:"+self.comboBox.currentText()) # 显示选择的职位


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "职位:"))


import sys
# 主方法,程序从此处启动PyQt设计的窗体
if __name__ == '__main__':
   app = QtWidgets.QApplication(sys.argv)
   MainWindow = QtWidgets.QMainWindow() # 创建窗体对象
   ui = Ui_MainWindow() # 创建PyQt设计的窗体对象
   ui.setupUi(MainWindow) # 调用PyQt窗体的方法对窗体对象进行初始化设置
   MainWindow.show() # 显示窗体
   sys.exit(app.exec_()) # 程序关闭时退出进程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43812198/article/details/131367439

智能推荐

874计算机科学基础综合,2018年四川大学874计算机科学专业基础综合之计算机操作系统考研仿真模拟五套题...-程序员宅基地

文章浏览阅读1.1k次。一、选择题1. 串行接口是指( )。A. 接口与系统总线之间串行传送,接口与I/0设备之间串行传送B. 接口与系统总线之间串行传送,接口与1/0设备之间并行传送C. 接口与系统总线之间并行传送,接口与I/0设备之间串行传送D. 接口与系统总线之间并行传送,接口与I/0设备之间并行传送【答案】C2. 最容易造成很多小碎片的可变分区分配算法是( )。A. 首次适应算法B. 最佳适应算法..._874 计算机科学专业基础综合题型

XShell连接失败:Could not connect to '192.168.191.128' (port 22): Connection failed._could not connect to '192.168.17.128' (port 22): c-程序员宅基地

文章浏览阅读9.7k次,点赞5次,收藏15次。连接xshell失败,报错如下图,怎么解决呢。1、通过ps -e|grep ssh命令判断是否安装ssh服务2、如果只有客户端安装了,服务器没有安装,则需要安装ssh服务器,命令:apt-get install openssh-server3、安装成功之后,启动ssh服务,命令:/etc/init.d/ssh start4、通过ps -e|grep ssh命令再次判断是否正确启动..._could not connect to '192.168.17.128' (port 22): connection failed.

杰理之KeyPage【篇】_杰理 空白芯片 烧入key文件-程序员宅基地

文章浏览阅读209次。00000000_杰理 空白芯片 烧入key文件

一文读懂ChatGPT,满足你对chatGPT的好奇心_引发对chatgpt兴趣的表述-程序员宅基地

文章浏览阅读475次。2023年初,“ChatGPT”一词在社交媒体上引起了热议,人们纷纷探讨它的本质和对社会的影响。就连央视新闻也对此进行了报道。作为新传专业的前沿人士,我们当然不能忽视这一热点。本文将全面解析ChatGPT,打开“技术黑箱”,探讨它对新闻与传播领域的影响。_引发对chatgpt兴趣的表述

中文字符频率统计python_用Python数据分析方法进行汉字声调频率统计分析-程序员宅基地

文章浏览阅读259次。用Python数据分析方法进行汉字声调频率统计分析木合塔尔·沙地克;布合力齐姑丽·瓦斯力【期刊名称】《电脑知识与技术》【年(卷),期】2017(013)035【摘要】该文首先用Python程序,自动获取基本汉字字符集中的所有汉字,然后用汉字拼音转换工具pypinyin把所有汉字转换成拼音,最后根据所有汉字的拼音声调,统计并可视化拼音声调的占比.【总页数】2页(13-14)【关键词】数据分析;数据可..._汉字声调频率统计

linux输出信息调试信息重定向-程序员宅基地

文章浏览阅读64次。最近在做一个android系统移植的项目,所使用的开发板com1是调试串口,就是说会有uboot和kernel的调试信息打印在com1上(ttySAC0)。因为后期要使用ttySAC0作为上层应用通信串口,所以要把所有的调试信息都给去掉。参考网上的几篇文章,自己做了如下修改,终于把调试信息重定向到ttySAC1上了,在这做下记录。参考文章有:http://blog.csdn.net/longt..._嵌入式rootfs 输出重定向到/dev/console

随便推点

uniapp 引入iconfont图标库彩色symbol教程_uniapp symbol图标-程序员宅基地

文章浏览阅读1.2k次,点赞4次,收藏12次。1,先去iconfont登录,然后选择图标加入购物车 2,点击又上角车车添加进入项目我的项目中就会出现选择的图标 3,点击下载至本地,然后解压文件夹,然后切换到uniapp打开终端运行注:要保证自己电脑有安装node(没有安装node可以去官网下载Node.js 中文网)npm i -g iconfont-tools(mac用户失败的话在前面加个sudo,password就是自己的开机密码吧)4,终端切换到上面解压的文件夹里面,运行iconfont-tools 这些可以默认也可以自己命名(我是自己命名的_uniapp symbol图标

C、C++ 对于char*和char[]的理解_c++ char*-程序员宅基地

文章浏览阅读1.2w次,点赞25次,收藏192次。char*和char[]都是指针,指向第一个字符所在的地址,但char*是常量的指针,char[]是指针的常量_c++ char*

Sublime Text2 使用教程-程序员宅基地

文章浏览阅读930次。代码编辑器或者文本编辑器,对于程序员来说,就像剑与战士一样,谁都想拥有一把可以随心驾驭且锋利无比的宝剑,而每一位程序员,同样会去追求最适合自己的强大、灵活的编辑器,相信你和我一样,都不会例外。我用过的编辑器不少,真不少~ 但却没有哪款让我特别心仪的,直到我遇到了 Sublime Text 2 !如果说“神器”是我能给予一款软件最高的评价,那么我很乐意为它封上这么一个称号。它小巧绿色且速度非

对10个整数进行按照从小到大的顺序排序用选择法和冒泡排序_对十个数进行大小排序java-程序员宅基地

文章浏览阅读4.1k次。一、选择法这是每一个数出来跟后面所有的进行比较。2.冒泡排序法,是两个相邻的进行对比。_对十个数进行大小排序java

物联网开发笔记——使用网络调试助手连接阿里云物联网平台(基于MQTT协议)_网络调试助手连接阿里云连不上-程序员宅基地

文章浏览阅读2.9k次。物联网开发笔记——使用网络调试助手连接阿里云物联网平台(基于MQTT协议)其实作者本意是使用4G模块来实现与阿里云物联网平台的连接过程,但是由于自己用的4G模块自身的限制,使得阿里云连接总是无法建立,已经联系客服返厂检修了,于是我在此使用网络调试助手来演示如何与阿里云物联网平台建立连接。一.准备工作1.MQTT协议说明文档(3.1.1版本)2.网络调试助手(可使用域名与服务器建立连接)PS:与阿里云建立连解释,最好使用域名来完成连接过程,而不是使用IP号。这里我跟阿里云的售后工程师咨询过,表示对应_网络调试助手连接阿里云连不上

<<<零基础C++速成>>>_无c语言基础c++期末速成-程序员宅基地

文章浏览阅读544次,点赞5次,收藏6次。运算符与表达式任何高级程序设计语言中,表达式都是最基本的组成部分,可以说C++中的大部分语句都是由表达式构成的。_无c语言基础c++期末速成