python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python进制转换

Python+pyqt实现即时进制转换计算器

作者:Goona_

在数字系统广泛应用的今天,快速准确地实现二进制和十进制之间的转换是程序员和工程师的常见需求,本文将使用Python和pyqt实现即时进制转换计算器,需要的小伙伴可以了解下

一、引言

在数字系统广泛应用的今天,快速准确地实现二进制和十进制之间的转换是程序员和工程师的常见需求。传统的进制转换工具往往需要手动触发计算,效率较低且容易出错。为此,基于PyQt框架和Python语言开发了一款即时进制转换计算器,通过实时响应用户输入,显著提升了进制转换的便捷性和准确性。

二、GUI界面设计

使用PyQt5进行界面的搭建,界面如下:

初始界面搭建采用极简风格。用户可通过切换页面标签,自主选择不同的转换方向,从而实现任意二进制数和十进制数的实时转换。

1.效果演示

可以看到,响应速度相当快。只要用户输入任意位数的二进制/十进制数,马上就能够得到对应的十进制/二进制表达结果。与传统的进制转换工具相比,省去了手动触发计算,效率较高且结果正确性也得到保证,实时响应用户输入,显著提升了进制转换的便捷性和准确性。

对于用户提示,这里并未加入。直接使用正则表达式(后续详解)规避了用户所有输入错误情况。

2.界面设计.py

通过pyuic5产生的GUI界面代码jiemian.py如下:

# -*- coding: utf-8 -*-
 
# Form implementation generated from reading ui file 'jiemian.ui'
#
# Created by: PyQt5 UI code generator 5.15.11
#
# 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_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.setEnabled(True)
        Form.resize(340, 370)
        Form.setMinimumSize(QtCore.QSize(340, 370))
        Form.setMaximumSize(QtCore.QSize(340, 370))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/image1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        Form.setWindowIcon(icon)
        self.label_5 = QtWidgets.QLabel(Form)
        self.label_5.setGeometry(QtCore.QRect(180, 60, 141, 31))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(16)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        self.label_8 = QtWidgets.QLabel(Form)
        self.label_8.setGeometry(QtCore.QRect(100, 20, 251, 31))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(18)
        font.setBold(False)
        font.setWeight(50)
        self.label_8.setFont(font)
        self.label_8.setObjectName("label_8")
        self.label_10 = QtWidgets.QLabel(Form)
        self.label_10.setGeometry(QtCore.QRect(260, 50, 71, 51))
        self.label_10.setText("")
        self.label_10.setPixmap(QtGui.QPixmap(":/image1.png"))
        self.label_10.setObjectName("label_10")
        self.tabWidget = QtWidgets.QTabWidget(Form)
        self.tabWidget.setGeometry(QtCore.QRect(30, 120, 281, 221))
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.lineEdit = QtWidgets.QLineEdit(self.tab)
        self.lineEdit.setGeometry(QtCore.QRect(30, 60, 211, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.label = QtWidgets.QLabel(self.tab)
        self.label.setGeometry(QtCore.QRect(20, 30, 221, 16))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.tab)
        self.label_2.setGeometry(QtCore.QRect(20, 100, 171, 16))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.tab)
        self.label_3.setGeometry(QtCore.QRect(30, 130, 211, 21))
        self.label_3.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.label_3.setText("")
        self.label_3.setObjectName("label_3")
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.tab_2)
        self.lineEdit_2.setGeometry(QtCore.QRect(30, 60, 211, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.label_4 = QtWidgets.QLabel(self.tab_2)
        self.label_4.setGeometry(QtCore.QRect(30, 130, 211, 21))
        self.label_4.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.label_4.setText("")
        self.label_4.setObjectName("label_4")
        self.label_6 = QtWidgets.QLabel(self.tab_2)
        self.label_6.setGeometry(QtCore.QRect(20, 100, 171, 16))
        self.label_6.setObjectName("label_6")
        self.label_7 = QtWidgets.QLabel(self.tab_2)
        self.label_7.setGeometry(QtCore.QRect(20, 30, 221, 16))
        self.label_7.setObjectName("label_7")
        self.tabWidget.addTab(self.tab_2, "")
 
        self.retranslateUi(Form)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Form)
 
    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Conversion"))
        self.label_5.setText(_translate("Form", "Designed By"))
        self.label_8.setText(_translate("Form", "进制转换器"))
        self.label.setText(_translate("Form", "请输入二进制数:"))
        self.label_2.setText(_translate("Form", "对应十进制数为:"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Form", "二进制转十进制"))
        self.label_6.setText(_translate("Form", "对应二进制数为:"))
        self.label_7.setText(_translate("Form", "请输入十进制数:"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("Form", "十进制转二进制"))
import ziyuan_rc

三、主要程序详解

1.导入相关模块

import sys
from jiemian import *
from PyQt5.QtWidgets import QApplication, QWidget
# 正则表达式
from PyQt5.QtGui import QRegExpValidator
# 保持窗口大小和qtdesigner中的一致
from PyQt5 import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)

QRegExpValidator与正则表达式有关; 不懂为啥需要导入Qtcore的,请看

2.初始化设置

class window(QWidget, Ui_Form):
    def __init__(self):
        super(QWidget, self).__init__()
        self.setupUi(self)
 
        self.lineEdit.textChanged.connect(self.to_ten)
        self.lineEdit_2.textChanged.connect(self.to_two)
 
        # 正则表达式限制输入
        validator1 = QRegExpValidator(QtCore.QRegExp("^[01]+$"))
        self.lineEdit.setValidator(validator1)
        validator2 = QRegExpValidator(QtCore.QRegExp("^[1-9]\d*$"))
        self.lineEdit_2.setValidator(validator2)

将lineedit绑定于to_ten,一旦lineedit的内容text发生变化,则去执行to_ten里的内容;lineedit_2同理;对lineedit使用正则表达式"^[01]+$",目的是限制用户输入仅由0与1组成,直到字符串的末尾,同时也排除了其他特殊符号的输入(如“.”、“;”等);对lineedit_2使用正则表达式"^[1-9]\d*$",目的是限制用户仅能输入十进制整数,“^[1-9]”表示起始位置以[1-9]中任意数字开头,“\d”等价于[0-9],表示后续数字可从[0-9]中任选。

3.二进制转十进制

    def to_ten(self):
        """二进制数转十进制"""
        sum = 0
        shuru = self.lineEdit.text()
        shuru_len = len(shuru)
 
        for i in range(shuru_len):
            sum = sum+pow(2,(shuru_len-1-i))*int(shuru[i])
 
        self.label_3.setText(str(sum))

sum表示最终求和结果;分别读取lineedit的内容和长度存储在shuru和shuru_len中;以for循环遍历用户输入的字符串,对每一项进行加权求和,并将累加结果赋予sum中;最后将计算结果显示在label_3上。

“按权展开求和法”思路:

4.十进制转二进制

    def to_two(self):
        """十进制数转二进制"""
        yu_lst = []
 
        shuru = int(self.lineEdit_2.text())
        while (shuru != 0):
            yu = shuru % 2
            shuru = shuru//2
            yu_lst.append(str(yu))
 
        yu_lst.reverse()
        self.label_4.setText(''.join(yu_lst))

yu_lst用于存储余数;读取lineedit_2的内容并将其强制int转换后存储在shuru中;以shuru不为0作为while循环的依据;将每次得到的余数yu添加至列表yu_lst末尾,并以商更新shuru 的值,直至商为0时,结束while循环;最后反转列表yu_lst(从高位到低位排列)后,合并为新的字符串显示在label_4上。

“除2取余法”思路:

四、总程序代码

import sys
from jiemian import *
from PyQt5.QtWidgets import QApplication, QWidget
# 正则表达式
from PyQt5.QtGui import QRegExpValidator
# 保持窗口大小和qtdesigner中的一致
from PyQt5 import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
 
class window(QWidget, Ui_Form):
    def __init__(self):
        super(QWidget, self).__init__()
        self.setupUi(self)
 
        self.lineEdit.textChanged.connect(self.to_ten)
        self.lineEdit_2.textChanged.connect(self.to_two)
 
        # 正则表达式限制输入
        validator1 = QRegExpValidator(QtCore.QRegExp("^[01]+$"))
        self.lineEdit.setValidator(validator1)
        validator2 = QRegExpValidator(QtCore.QRegExp("^[1-9]\d*$"))
        self.lineEdit_2.setValidator(validator2)
 
    def to_ten(self):
        """二进制数转十进制"""
        sum = 0
        shuru = self.lineEdit.text()
        shuru_len = len(shuru)
 
        for i in range(shuru_len):
            sum = sum+pow(2,(shuru_len-1-i))*int(shuru[i])
 
        self.label_3.setText(str(sum))
 
    def to_two(self):
        """十进制数转二进制"""
        yu_lst = []
 
        shuru = int(self.lineEdit_2.text())
        while (shuru != 0):
            yu = shuru % 2
            shuru = shuru//2
            yu_lst.append(str(yu))
 
        yu_lst.reverse()
        self.label_4.setText(''.join(yu_lst))
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = window()
    w.show()
    sys.exit(app.exec_())

到此这篇关于Python+pyqt实现即时进制转换计算器的文章就介绍到这了,更多相关Python进制转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文