关于PYQT+python3.X文本输入审查的解决办法

时间:2022-08-10 23:03:38

      好久不写微博了,最近抱着linux乱啃。这不,老师催着交进制转换和ASC编码的作业,程序网上海了去了,就是自己太长时间没写程序,手疼的痒痒,所以今天自己写一次。其实啊,进制转化什么的,python都有内置函数,我也懒得自己敲,真正想解决的就是用户从文本框输入审查的问题。

      正所谓,没一个用户是正常的!就像二进制转十进制的问题,你能指望用户输入的全部都是丨和0吗?(没错,那不是1,那也不是| 那是丨(拼音:gun))对吧,这样的非法字符串直接丢给python内置函数,无疑就是game over。所以我增加了输入审查。

敲黑板,划重点:

软件功能:有三个文本框,对应二进制,十进制,十六进制。任意一个文本框内容改变,其他文本框也改变。就是一个进制转换工具。关于PYQT+python3.X文本输入审查的解决办法

1. 输入审查位置

      我在两种情况下增加了输入审查机制。

      1. 文本框内容被修改时。

      2.用户触发运算机制时(就是将文本框字符串传递给其他函数时)。

2.输入审查内容

      根据不同的需要,有不同的输入审查内容。我从简到繁来讲解下。

      1.二进制输入审查

             我们都知道,二进制只有0和1两个字符。我们从槽函数获取到的是字符串,只要审查它是不是只有0和1两              个字符就行。

             1. 对字符串审查的函数

'审查st字符串中是否都是二进制字符'
def check_two(st):
    a=['1', '0']       #创建一个列表,存放二进制字符
    for x in st:           #对字符串st进行遍历
        if x not in a:    #如果字符串st中的元素有不在a列表中的
            return False #则返回错误
    return True          #经过遍历,未返回错误,则返回正确

               2. 对不合法字符进行删除

                  如果用户输入了一个不合法的字符,我们就将二进制文本框的最后一个字符删掉。这样的话,对用户来说,他在字符串末尾输入了一个不合法字符,结果文本框内容根本没变化。(如果输入一串不合法字符,或是在合法字符前输入的话,就会循环触发槽函数,从后向前删除字符,直到删除的只剩合法字符为止!例如:原来是111000111,输入了一个2,变成:1110002111,触发槽函数,最后变成:111000)

    @pyqtSlot(str)
    def on_two_textChanged(self, p0):
        """
        当二进制文本框内容发生改变时,触发这个槽函数
        """
        if self.two.text() != ""  :               #如果二进制文本框内容是空的话,则触发else(主要是针对用户输入了,自己又删空,导致十进制和十六进制文本框不能为空的状态)
            if check_two(self.two.text()):    #检查字符串内是否全是二进制字符,否则触发自我修改机制
                 t=str(int(self.two.text(),2))  #以下是计算,输出的内容
                 s=hex(int(t))
                 self.ten.setText(t)
                 self.six.setText(s[2:])
            else:
                self.two.setText(self.two.text()[:-1])   #将文本框内容的最后一个字符删掉
        else:                                         #清空十进制和十六进制(six)的内容
            self.ten.setText('')
            self.six.setText('')

      2.十进制输入审查

           和二进制同理,只不过审查函数数组a变一下。十六进制一样的啦

def check_ten(st):
    a=['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
    for x in st:
        if x not in a:
            return False
    return True

    3.对ASCII字符进行审查

        1.审查函数

            如果输入的不是ASCII的字符的话则返回错误,否则则返回正确。主要借用了ord(c)函数,作用是把字符转化为对应的十             进制数字,我们知道,ASCII表字符从0-127所以对应数字大于128的肯定不是ASCII字符,所以一个遍历就可以判断,再调用。上面所写的修改函数,就可以让用户输不进去非ASCII字符了。

'审查字符串str中是不是全是ASCII的字符'
def check_asc(str):
    for x in str:           #遍历字符串str
        if ord(x)>128:   #ord(c)是将字符c转化为对应的十进制数字,如果这个数字大于128则不是ASCii表字符
            return False
    return True

下面附程序全部界面

关于PYQT+python3.X文本输入审查的解决办法

ps: 我就是天域至尊

附全部源码:

源码工程文件包及打包好的应用程序下载地址:

点击打开链接

窗口布局代码:Ui_first.py

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

# Form implementation generated from reading ui file 'C:\Users\Liang\Desktop\新建文件夹\frist.ui'
#
# Created by: PyQt5 UI code generator 5.9.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(564, 492)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.formLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.formLayoutWidget.setGeometry(QtCore.QRect(10, 30, 261, 118))
        self.formLayoutWidget.setObjectName("formLayoutWidget")
        self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget)
        self.formLayout.setContentsMargins(0, 0, 0, 0)
        self.formLayout.setObjectName("formLayout")
        self.label = QtWidgets.QLabel(self.formLayoutWidget)
        self.label.setObjectName("label")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
        self.ten = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.ten.setObjectName("ten")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.ten)
        self.label_2 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_2.setObjectName("label_2")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)
        self.two = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.two.setObjectName("two")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.two)
        self.label_3 = QtWidgets.QLabel(self.formLayoutWidget)
        self.label_3.setObjectName("label_3")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_3)
        self.six = QtWidgets.QLineEdit(self.formLayoutWidget)
        self.six.setObjectName("six")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.six)
        self.cleck_num = QtWidgets.QPushButton(self.formLayoutWidget)
        self.cleck_num.setObjectName("cleck_num")
        self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.cleck_num)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.formLayout.setItem(4, QtWidgets.QFormLayout.FieldRole, spacerItem)
        self.gridLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 180, 471, 281))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.A_answer = QtWidgets.QTextBrowser(self.gridLayoutWidget)
        self.A_answer.setObjectName("A_answer")
        self.gridLayout.addWidget(self.A_answer, 1, 1, 1, 1)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem1, 1, 2, 1, 1)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem2, 1, 0, 1, 1)
        self.B_answer = QtWidgets.QTextBrowser(self.gridLayoutWidget)
        self.B_answer.setObjectName("B_answer")
        self.gridLayout.addWidget(self.B_answer, 1, 3, 1, 1)
        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem3, 1, 4, 1, 1)
        self.clickASC = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.clickASC.setObjectName("clickASC")
        self.gridLayout.addWidget(self.clickASC, 2, 3, 1, 1)
        spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem4, 2, 2, 1, 1)
        self.gridLayout_2 = QtWidgets.QGridLayout()
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.label_4 = QtWidgets.QLabel(self.gridLayoutWidget)
        self.label_4.setObjectName("label_4")
        self.gridLayout_2.addWidget(self.label_4, 0, 3, 1, 1)
        self.label_5 = QtWidgets.QLabel(self.gridLayoutWidget)
        self.label_5.setObjectName("label_5")
        self.gridLayout_2.addWidget(self.label_5, 0, 1, 1, 1)
        self.A_end = QtWidgets.QLineEdit(self.gridLayoutWidget)
        self.A_end.setObjectName("A_end")
        self.gridLayout_2.addWidget(self.A_end, 1, 3, 1, 1)
        self.A_first = QtWidgets.QLineEdit(self.gridLayoutWidget)
        self.A_first.setObjectName("A_first")
        self.gridLayout_2.addWidget(self.A_first, 1, 1, 1, 1)
        spacerItem5 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout_2.addItem(spacerItem5, 2, 1, 1, 1)
        spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem6, 0, 0, 1, 1)
        spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem7, 0, 4, 1, 1)
        spacerItem8 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem8, 0, 2, 1, 1)
        self.A_begin = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.A_begin.setObjectName("A_begin")
        self.gridLayout_2.addWidget(self.A_begin, 2, 3, 1, 1)
        self.gridLayout.addLayout(self.gridLayout_2, 0, 1, 1, 1)
        self.gridLayout_3 = QtWidgets.QGridLayout()
        self.gridLayout_3.setObjectName("gridLayout_3")
        spacerItem9 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout_3.addItem(spacerItem9, 2, 1, 1, 1)
        self.label_6 = QtWidgets.QLabel(self.gridLayoutWidget)
        self.label_6.setObjectName("label_6")
        self.gridLayout_3.addWidget(self.label_6, 0, 3, 1, 1)
        self.label_7 = QtWidgets.QLabel(self.gridLayoutWidget)
        self.label_7.setObjectName("label_7")
        self.gridLayout_3.addWidget(self.label_7, 0, 1, 1, 1)
        self.B_frist = QtWidgets.QLineEdit(self.gridLayoutWidget)
        self.B_frist.setObjectName("B_frist")
        self.gridLayout_3.addWidget(self.B_frist, 1, 1, 1, 1)
        spacerItem10 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_3.addItem(spacerItem10, 0, 0, 1, 1)
        self.B_end = QtWidgets.QLineEdit(self.gridLayoutWidget)
        self.B_end.setObjectName("B_end")
        self.gridLayout_3.addWidget(self.B_end, 1, 3, 1, 1)
        spacerItem11 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_3.addItem(spacerItem11, 0, 4, 1, 1)
        spacerItem12 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_3.addItem(spacerItem12, 0, 2, 1, 1)
        self.B_begin = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.B_begin.setObjectName("B_begin")
        self.gridLayout_3.addWidget(self.B_begin, 2, 3, 1, 1)
        self.gridLayout.addLayout(self.gridLayout_3, 0, 3, 1, 1)
        spacerItem13 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem13, 3, 1, 1, 1)
        self.label_8 = QtWidgets.QLabel(self.centralwidget)
        self.label_8.setGeometry(QtCore.QRect(10, 10, 151, 16))
        font = QtGui.QFont()
        font.setFamily("新宋体")
        font.setPointSize(12)
        self.label_8.setFont(font)
        self.label_8.setObjectName("label_8")
        self.label_9 = QtWidgets.QLabel(self.centralwidget)
        self.label_9.setGeometry(QtCore.QRect(20, 150, 161, 21))
        font = QtGui.QFont()
        font.setFamily("新宋体")
        font.setPointSize(12)
        self.label_9.setFont(font)
        self.label_9.setObjectName("label_9")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(490, 430, 62, 19))
        self.pushButton_3.setObjectName("pushButton_3")
        self.label_10 = QtWidgets.QLabel(self.centralwidget)
        self.label_10.setGeometry(QtCore.QRect(450, 460, 101, 16))
        self.label_10.setObjectName("label_10")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.pushButton_3.clicked.connect(MainWindow.close)
        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.label_3.setText(_translate("MainWindow", "十六进制"))
        self.cleck_num.setText(_translate("MainWindow", "清零"))
        self.clickASC.setText(_translate("MainWindow", "清零"))
        self.label_4.setText(_translate("MainWindow", "A终止位置"))
        self.label_5.setText(_translate("MainWindow", "A起始位置"))
        self.A_begin.setText(_translate("MainWindow", "A计算"))
        self.label_6.setText(_translate("MainWindow", "B终止位置"))
        self.label_7.setText(_translate("MainWindow", "B起始位置"))
        self.B_begin.setText(_translate("MainWindow", "B计算"))
        self.label_8.setText(_translate("MainWindow", "进制转换工具"))
        self.label_9.setText(_translate("MainWindow", "ASC码字符比较工具"))
        self.pushButton_3.setText(_translate("MainWindow", "关闭"))
        self.label_10.setText(_translate("MainWindow", "power by 天域至尊"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

槽函数及功能实现代码:first.py

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

"""
Module implementing MainWindow.
"""

from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow
from Ui_frist import Ui_MainWindow
from PyQt5 import QtWidgets

def check_ten(st):
    a=['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
    for x in st:
        if x not in a:
            return False
    return True
'审查st字符串中是否都是二进制字符'
def check_two(st):
    a=['1', '0']       #创建一个列表,存放二进制字符
    for x in st:           #对字符串st进行遍历
        if x not in a:    #如果字符串st中的元素有不在a列表中的
            return False #则返回错误
    return True          #经过遍历,未返回错误,则返回正确

def check_six(st):
    a=['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']
    for x in st:
        if x not in a:
            return False
    return True
'审查字符串str中是不是全是ASCII的字符'
def check_asc(str):
    for x in str:           #遍历字符串str
        if ord(x)>128:   #ord(c)是将字符c转化为对应的十进制数字,如果这个数字大于128则不是ASCii表字符
            return False
    return True
class MainWindow(QMainWindow, Ui_MainWindow):
    """
    Class documentation goes here.
    """
    def __init__(self, parent=None):
        """
        Constructor
        
        @param parent reference to the parent widget
        @type QWidget
        """
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
    
    @pyqtSlot(str)
    def on_ten_textChanged(self, p0):
        """
        Slot documentation goes here.
        
        @param p0 DESCRIPTION
        @type str
        """
        if self.ten.text() != "":
            if check_ten(self.ten.text()):
                self.two.setText(bin(int(self.ten.text()))[2:])
                self.six.setText(hex(int(self.ten.text()))[2:])
            else:
                self.ten.setText(self.ten.text()[:-1])
        else:
            self.two.setText('')
            self.six.setText('')
    
    @pyqtSlot(str)
    def on_two_textChanged(self, p0):
        """
        当二进制文本框内容发生改变时,触发这个槽函数
        """
        if self.two.text() != ""  :               #如果二进制文本框内容是空的话,则触发else(主要是针对用户输入了,自己又删空,导致十进制和十六进制文本框不能为空的状态)
            if check_two(self.two.text()):    #检查字符串内是否全是二进制字符,否则触发自我修改机制
                 t=str(int(self.two.text(),2))  #以下是计算,输出的内容
                 s=hex(int(t))
                 self.ten.setText(t)
                 self.six.setText(s[2:])
            else:
                self.two.setText(self.two.text()[:-1])   #将文本框内容的最后一个字符删掉
        else:                                         #清空十进制和十六进制(six)的内容
            self.ten.setText('')
            self.six.setText('')
    
    @pyqtSlot(str)
    def on_six_textChanged(self, p0):
        """
        Slot documentation goes here.
        
        @param p0 DESCRIPTION
        @type str
        """
        if self.six.text() != "":
            if check_six(self.six.text()):
                t=int(self.six.text(), 16)
                tw=bin(int(t))
                self.two.setText(str(tw)[2:])
                self.ten.setText(str(t))
            else:
                self.six.setText(self.six.text()[:-1])
        else:
            self.two.setText('')
            self.ten.setText('')
    
    @pyqtSlot()
    def on_A_begin_clicked(self):
        """
        Slot documentation goes here.
        """
        if len(self.A_first.text())==1 and len(self.A_end.text())==1 and check_asc(self.A_first.text()) and check_asc(self.A_end.text()):
            if ord(self.A_first.text()[0])>ord(self.A_end.text()[0]):
                f=ord(self.A_end.text()[0])
                e=ord(self.A_first.text()[0])
            else:
                f=ord(self.A_first.text()[0])
                e=ord(self.A_end.text()[0])
                self.A_answer.append('字符'+'  '+'编码')
            while f<=e:
                self.A_answer.append(chr(f)+'     '+str(f))
                f=f+1
        else:
            self.A_answer.setText("错误!您输入的A数据有误!")
    
    @pyqtSlot()
    def on_cleck_num_clicked(self):
        """
        Slot documentation goes here.
        """
        self.two.setText('')
        self.ten.setText('')
        self.six.setText('')
    
    @pyqtSlot()
    def on_clickASC_clicked(self):
        """
        Slot documentation goes here.
        """
        self.A_answer.setText("")
        self.A_first.setText("")
        self.A_end.setText("")
        self.B_end.setText("")
        self.B_frist.setText("")
        self.B_answer.setText("")
    
    @pyqtSlot()
    def on_B_begin_clicked(self):
        """
        Slot documentation goes here.
        """
        if len(self.B_frist.text())==1 and len(self.B_end.text())==1 and check_asc(self.B_frist.text()) and check_asc(self.B_end.text()):
            if ord(self.B_frist.text()[0])>ord(self.B_end.text()[0]):
                f=ord(self.B_end.text()[0])
                e=ord(self.B_frist.text()[0])
            else:
                f=ord(self.B_frist.text()[0])
                e=ord(self.B_end.text()[0])
                self.B_answer.append('字符'+'  '+'编码')
            while f<=e:
                self.B_answer.append(chr(f)+'     '+str(f))
                f=f+1
        else:
            self.B_answer.setText("错误!您输入的B数据有误!")

    @pyqtSlot(str)
    def on_A_end_textChanged(self, p0):
        """
        Slot documentation goes here.
        
        @param p0 DESCRIPTION
        @type str
        """
        if check_asc(self.A_end.text()):
            if len(self.A_end.text())>1:
                self.A_end.setText(self.A_end.text()[-1])
        else:
            self.A_end.setText('')
    
    @pyqtSlot(str)
    def on_A_first_textChanged(self, p0):
        """
        Slot documentation goes here.
        
        @param p0 DESCRIPTION
        @type str
        """
        if check_asc(self.A_first.text()):
            if len(self.A_first.text())>1:
                self.A_first.setText(self.A_first.text()[-1])
        else:
            self.A_first.setText('')
    
    @pyqtSlot(str)
    def on_B_frist_textChanged(self, p0):
        """
        Slot documentation goes here.
        
        @param p0 DESCRIPTION
        @type str
        """
        if check_asc(self.B_frist.text()):
            if len(self.B_frist.text())>1:
                self.B_frist.setText(self.B_frist.text()[-1])
        else:
            self.B_frist.setText('')
    
    @pyqtSlot(str)
    def on_B_end_textChanged(self, p0):
        """
        Slot documentation goes here.
        
        @param p0 DESCRIPTION
        @type str
        """
        if check_asc(self.B_end.text()):
            if len(self.B_end.text())>1:
                self.B_end.setText(self.B_end.text()[-1])
        else:
            self.B_end.setText('')

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    ui = MainWindow()
    ui.show()
    sys.exit(app.exec_())