Python+pyqt實(shí)現(xiàn)即時(shí)進(jìn)制轉(zhuǎn)換計(jì)算器
一、引言
在數(shù)字系統(tǒng)廣泛應(yīng)用的今天,快速準(zhǔn)確地實(shí)現(xiàn)二進(jìn)制和十進(jìn)制之間的轉(zhuǎn)換是程序員和工程師的常見(jiàn)需求。傳統(tǒng)的進(jìn)制轉(zhuǎn)換工具往往需要手動(dòng)觸發(fā)計(jì)算,效率較低且容易出錯(cuò)。為此,基于PyQt框架和Python語(yǔ)言開(kāi)發(fā)了一款即時(shí)進(jìn)制轉(zhuǎn)換計(jì)算器,通過(guò)實(shí)時(shí)響應(yīng)用戶(hù)輸入,顯著提升了進(jìn)制轉(zhuǎn)換的便捷性和準(zhǔn)確性。
二、GUI界面設(shè)計(jì)
使用PyQt5進(jìn)行界面的搭建,界面如下:

初始界面搭建采用極簡(jiǎn)風(fēng)格。用戶(hù)可通過(guò)切換頁(yè)面標(biāo)簽,自主選擇不同的轉(zhuǎn)換方向,從而實(shí)現(xiàn)任意二進(jìn)制數(shù)和十進(jìn)制數(shù)的實(shí)時(shí)轉(zhuǎn)換。
1.效果演示

可以看到,響應(yīng)速度相當(dāng)快。只要用戶(hù)輸入任意位數(shù)的二進(jìn)制/十進(jìn)制數(shù),馬上就能夠得到對(duì)應(yīng)的十進(jìn)制/二進(jìn)制表達(dá)結(jié)果。與傳統(tǒng)的進(jìn)制轉(zhuǎn)換工具相比,省去了手動(dòng)觸發(fā)計(jì)算,效率較高且結(jié)果正確性也得到保證,實(shí)時(shí)響應(yīng)用戶(hù)輸入,顯著提升了進(jìn)制轉(zhuǎn)換的便捷性和準(zhǔn)確性。
對(duì)于用戶(hù)提示,這里并未加入。直接使用正則表達(dá)式(后續(xù)詳解)規(guī)避了用戶(hù)所有輸入錯(cuò)誤情況。
2.界面設(shè)計(jì).py
通過(guò)pyuic5產(chǎn)生的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", "進(jìn)制轉(zhuǎn)換器"))
self.label.setText(_translate("Form", "請(qǐng)輸入二進(jìn)制數(shù):"))
self.label_2.setText(_translate("Form", "對(duì)應(yīng)十進(jìn)制數(shù)為:"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Form", "二進(jìn)制轉(zhuǎn)十進(jìn)制"))
self.label_6.setText(_translate("Form", "對(duì)應(yīng)二進(jìn)制數(shù)為:"))
self.label_7.setText(_translate("Form", "請(qǐng)輸入十進(jìn)制數(shù):"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("Form", "十進(jìn)制轉(zhuǎn)二進(jìn)制"))
import ziyuan_rc三、主要程序詳解
1.導(dǎo)入相關(guān)模塊
import sys from jiemian import * from PyQt5.QtWidgets import QApplication, QWidget # 正則表達(dá)式 from PyQt5.QtGui import QRegExpValidator # 保持窗口大小和qtdesigner中的一致 from PyQt5 import QtCore QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
QRegExpValidator與正則表達(dá)式有關(guān); 不懂為啥需要導(dǎo)入Qtcore的,請(qǐng)看。
2.初始化設(shè)置
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)
# 正則表達(dá)式限制輸入
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的內(nèi)容text發(fā)生變化,則去執(zhí)行to_ten里的內(nèi)容;lineedit_2同理;對(duì)lineedit使用正則表達(dá)式"^[01]+$",目的是限制用戶(hù)輸入僅由0與1組成,直到字符串的末尾,同時(shí)也排除了其他特殊符號(hào)的輸入(如“.”、“;”等);對(duì)lineedit_2使用正則表達(dá)式"^[1-9]\d*$",目的是限制用戶(hù)僅能輸入十進(jìn)制整數(shù),“^[1-9]”表示起始位置以[1-9]中任意數(shù)字開(kāi)頭,“\d”等價(jià)于[0-9],表示后續(xù)數(shù)字可從[0-9]中任選。
3.二進(jìn)制轉(zhuǎn)十進(jìn)制
def to_ten(self):
"""二進(jìn)制數(shù)轉(zhuǎn)十進(jìn)制"""
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表示最終求和結(jié)果;分別讀取lineedit的內(nèi)容和長(zhǎng)度存儲(chǔ)在shuru和shuru_len中;以for循環(huán)遍歷用戶(hù)輸入的字符串,對(duì)每一項(xiàng)進(jìn)行加權(quán)求和,并將累加結(jié)果賦予sum中;最后將計(jì)算結(jié)果顯示在label_3上。
“按權(quán)展開(kāi)求和法”思路:

4.十進(jìn)制轉(zhuǎn)二進(jìn)制
def to_two(self):
"""十進(jìn)制數(shù)轉(zhuǎn)二進(jìn)制"""
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用于存儲(chǔ)余數(shù);讀取lineedit_2的內(nèi)容并將其強(qiáng)制int轉(zhuǎn)換后存儲(chǔ)在shuru中;以shuru不為0作為while循環(huán)的依據(jù);將每次得到的余數(shù)yu添加至列表yu_lst末尾,并以商更新shuru 的值,直至商為0時(shí),結(jié)束while循環(huán);最后反轉(zhuǎn)列表yu_lst(從高位到低位排列)后,合并為新的字符串顯示在label_4上。
“除2取余法”思路:

四、總程序代碼
import sys
from jiemian import *
from PyQt5.QtWidgets import QApplication, QWidget
# 正則表達(dá)式
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)
# 正則表達(dá)式限制輸入
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):
"""二進(jìn)制數(shù)轉(zhuǎn)十進(jìn)制"""
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):
"""十進(jìn)制數(shù)轉(zhuǎn)二進(jìn)制"""
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_())到此這篇關(guān)于Python+pyqt實(shí)現(xiàn)即時(shí)進(jìn)制轉(zhuǎn)換計(jì)算器的文章就介紹到這了,更多相關(guān)Python進(jìn)制轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python和Plotly繪制各種類(lèi)型3D圖形的方法
Python語(yǔ)言擁有豐富的數(shù)據(jù)可視化庫(kù),其中Plotly是一款流行的工具,提供了繪制高質(zhì)量三維圖形的功能,本文將介紹如何使用Python和Plotly來(lái)繪制各種類(lèi)型的3D圖形,并給出代碼實(shí)例,需要的朋友可以參考下2024-05-05
python3 dict ndarray 存成json,并保留原數(shù)據(jù)精度的實(shí)例
今天小編就為大家分享一篇python3 dict ndarray 存成json,并保留原數(shù)據(jù)精度的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
python一行代碼就能實(shí)現(xiàn)數(shù)據(jù)分析的pandas-profiling庫(kù)
這篇文章主要為大家介紹了python一行代碼就能實(shí)現(xiàn)數(shù)據(jù)分析的pandas-profiling庫(kù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Python urlopen()和urlretrieve()用法解析
這篇文章主要介紹了Python urlopen()和urlretrieve()用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Python學(xué)習(xí)小技巧之利用字典的默認(rèn)行為
這篇文章主要給大家介紹了Python學(xué)習(xí)小技巧之利用字典的默認(rèn)行為的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05
關(guān)于python下cv.waitKey無(wú)響應(yīng)的原因及解決方法
今天小編就為大家分享一篇關(guān)于python下cv.waitKey無(wú)響應(yīng)的原因及解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
使用OpenCV實(shí)現(xiàn)道路車(chē)輛計(jì)數(shù)的使用方法
這篇文章主要介紹了使用OpenCV實(shí)現(xiàn)道路車(chē)輛計(jì)數(shù)的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Selenium自動(dòng)化測(cè)試工具使用方法匯總
這篇文章主要介紹了Selenium自動(dòng)化測(cè)試工具使用方法匯總,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

