香,一套逻辑轻松且智能解决PyQt中控件数值验证的问题

PyQt开发中,时常需要对控件的值进行校验,如需要校验QCheckBox是否被选中,QLabel是否校验值是否为空等等。在复杂的业务场景下,这类控件如果数量很多,逐个校验就显得麻烦,需要一一获得控件名称,再调用对应的方法来判断是否被选中、是否为空等。而且开发过程中如果多控件做了增减,还需要增减校验的逻辑,那会要了老命。

此篇文章,推荐使用__dict__属性 + 字典映射来快速校验控件值,并且无视后面控件的增减,无需调整代码。

__dict__是什么?

python开发的,或多或少都接触过该属性,它是独有的一个特性,用来保存的一些属性,关于这个属性的相关文章,网上一抓一大把,此处不作赘述,需要说明的是,类实例也有自己的__dict__属性,而且和__dict不同,``类实例dict只保存了通过self.xxx`所声明的属性和方法。

校验逻辑演示

接下来的演示中,仅使用QCheckBox(为了省事),同时要保持这些控件的名称要具备同样的特征,下面的截图中,所有的控件名称都以checkbox结尾。

1、使用.ui文件生成.py文件

2、简单写个入口程序

继承刚才生成的.py文件,在这里可以实现自己的方法,在自定义类中,先打印__dict__,看看有哪些值。

{
  'centralwidget': <PyQt6.QtWidgets.QWidget object at 0x00000231DD4E9D30>, 
  'gridLayout': <PyQt6.QtWidgets.QGridLayout object at 0x00000231DD4E9DC0>, 
  'c_checkbox': <PyQt6.QtWidgets.QCheckBox object at 0x00000231DD4E9E50>, 
  'd_checkbox': <PyQt6.QtWidgets.QCheckBox object at 0x00000231DD4E9EE0>, 
  'a_checkbox': <PyQt6.QtWidgets.QCheckBox object at 0x00000231DD4E9F70>, 
  'b_checkbox': <PyQt6.QtWidgets.QCheckBox object at 0x00000231DD9A3040>, 
  'f_checkbox': <PyQt6.QtWidgets.QCheckBox object at 0x00000231DD9A30D0>, 
  'e_checkbox': <PyQt6.QtWidgets.QCheckBox object at 0x00000231DD9A3160>, 
  'menubar': <PyQt6.QtWidgets.QMenuBar object at 0x00000231DD9A31F0>, 
  'statusbar': <PyQt6.QtWidgets.QStatusBar object at 0x00000231DD9A3280>
}

可以看到,它是一个字典,它包含了界面上所有的控件的名称和实例对象,这里就体现出了控件名称命名时遵守统一特征的好处了,即能望文生义,也方便处理。

3、提取所有QCheckBox的控件名称,构建一个校验的通用逻辑

import sys
from PyQt6.QtWidgets import QMainWindow, QApplication, QCheckBox
from ui_main import Ui_MainWindow

class MainWindow(Ui_MainWindow, QMainWindow):
    def __init__(self):
        super().__init__()
        super().setupUi(self)
        self.show()
        self.checkboxs()

    
    def checkboxs(self):
        # print(self.__dict__)

        # 增加这个字典映射是为了可以自动处理更多类型的控件值校验
        widget_mapping = {
            'QCheckBox': QCheckBox.isChecked
        }
        
        # 获取所有QCheckBox的控件名称
        boxs = [
            item for item in self.__dict__ \
                if item.endswith('_checkbox')
        ]

        # 用来保存未被勾选的控件
        un_checked = []

        for item in boxs:
            widget_instance = self.__dict__.get(item)
            widget_method = widget_mapping.get(
                self.__dict__.get(item).__class__.__name__
            )
            # 如果该QCheckBox处于未选中,则被添加到列表中
            if not widget_method(widget_instance):
                un_checked.append(item)

        print(un_checked)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec())

4、逻辑分析

(1)
在代码

boxs = [
            item for item in self.__dict__ \
                if item.endswith('_checkbox')
        ]

中,通过__dict__提取了所有以_checkbox结尾的控件名称,注意,这只是字符串而已,并非控件本身。

(2)构建一个通用的控件名称和控件方法的字典映射

# 增加这个字典映射是为了可以自动处理更多类型的控件值校验
        widget_mapping = {
            'QCheckBox': QCheckBox.isChecked
        }

这么做的目的是为了让这个逻辑更具通用性,让这个逻辑兼容其他控件,简单来说,可以通过控件的名称(boxs列表)找到该控件对应的方法,因为每个控件获取值所用的方法不尽相同。

(3)遍历boxs列表,逐个去widget_mapping找对应的方法,假如这里要较多种控件的话,字典映射的优势就体现出来了。widget_method就是该控件获取值所要用的方法了,QCheckBox控件,就用isChecked方法来获取控件是否被选中。

(4)调用所找到的方法widget_method。这里之所以要把控件实例widget_instance传入方法中,是因为控件方法isChecked是单独调用的,它默认要传入self参数即实例本身。

运行代码看看效果

可以看到6个选项均为选中,打印结果符合该事实。

qt desinger中默认勾选两个,再试试效果

有4个未选中,打印结果符合事实。

总结

上面的仅为演示代码,只是演示处理此类问题的逻辑,刚构建逻辑时会显得很绕,但是构建起来后就很好用了,如果再渐增控件,只要遵守控件名称命名规范,那么所增加的控件校验也无需增加校验代码,减少控件也一样。

延申用法

如果一个界面中有很多控件需要填写数值或清空数值,如:

  • 提交表单后,控件数值初始化
  • 校验不通过,需要在控件中做信息提示(诸如placeholder)

一样可以使用这个逻辑进行处理,只要前期构建好,代码复用完全不是问题。

原文链接:https://www.cnblogs.com/mooremok/p/17321357.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:香,一套逻辑轻松且智能解决PyQt中控件数值验证的问题 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • 最新版 Windows10上安装Python 3.8.5的步骤详解

    下面是“最新版Windows10上安装Python3.8.5的步骤详解”的完整攻略: 安装Python3.8.5的步骤详解 Step 1:下载Python 3.8.5的安装包 在官网上下载Python 3.8.5的安装包:https://www.python.org/downloads/windows/ 推荐下载Windows x86-64 executab…

    python 2023年5月14日
    00
  • Python 实现微信自动回复的方法

    以下是详细的Python实现微信自动回复的方法攻略: 步骤一:安装必要的Python第三方包 在Python中实现微信自动回复,首先需要使用到itchat这个Python包,通过pip进行安装。 !pip install itchat 步骤二:登录微信 使用itchat包中的login方法登录自己的微信账号。 import itchat itchat.aut…

    python 2023年5月19日
    00
  • 在Python中使用NumPy对切比雪夫级数进行积分并设置积分顺序

    在Python中使用NumPy对切比雪夫级数进行积分并设置积分顺序的步骤如下: 1.导入必要的库 首先需要导入numpy库以及matplotlib用于可视化。 import numpy as np import matplotlib.pyplot as plt 2.设置切比雪夫级数函数 我们可以使用numpy库内置的 np.vectorize 函数将切比雪夫…

    python-answer 2023年3月25日
    00
  • Python调用API接口实现人脸识别

    Python调用API接口实现人脸识别是一种常见的应用场景,可以用于人脸识别、人脸比对、人脸检测等领域。本文将详细讲解如何使用Python调用API接口实现人脸识别,包括如何获取API接口、如何使用Python发送请求、如何解析API响应等。 获取API接口 首先,我们需要获取API接口。API接口是一种用于应用程序之间通信的协议,可以用于获取数据、提交数据…

    python 2023年5月15日
    00
  • Python 2/3下处理cjk编码的zip文件的方法

    Python中的zipfile模块可以用来操作zip文件。当zip文件中含有cjk编码的文件名或文件内容时,可能会出现一些问题。 下面是在Python 2/3中处理cjk编码的zip文件的方法: 1. 使用ZipFile类读取zip文件 在Python中,我们可以使用ZipFile类来读取zip文件。ZipFile可以接受三个参数:文件名、模式和压缩方法。 …

    python 2023年5月31日
    00
  • python实现进度条的多种实现

    以下是详细讲解”Python实现进度条的多种实现”的完整攻略。 1. 进度条的基本概念 进度条是程序中非常常见的一种交互方式,可以显示当前任务的进度和剩余时间,方便用户对程序的运行情况进行监控和调整,提高程序的使用体验。进度条通常由以下组成部分构成: 当前任务进度的百分比 显示进度百分比的进度条 剩余时间的估计 2. Python实现进度条的基本原理 Pyt…

    python 2023年5月20日
    00
  • Python数据类型之Set集合实例详解

    Python数据类型之Set集合实例详解 Set集合概述 Set集合是Python的一种数据类型,与List和Tuple不同,它是无序的,不重复的。可以将Set集合视为一个无值集合,其中每个元素都是独一无二的,可以是数字、字符串或者其他Python数据类型。 Set集合中不允许存在相同的元素,因此,如果试图将一个已经存在的元素添加到Set集合中,将不会有任何…

    python 2023年5月13日
    00
  • Cython 三分钟入门教程

    Cython 三分钟入门教程 什么是Cython Cython是一种基于Python语言的编译器,它可以将Python代码转换为C/C++代码,从而提高Python代码的执行效率。Cython可以使用Python的大部分语法,同时支持静态类型定义和C语言扩展,可以将Python代码转化为可以编译和执行的C语言代码。Cython通常与C的库或C++的库进行配合…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部