主页GUI代码,
大概的功能逻辑:通过选中不同的进制 输入相应的数字 实时转换成对应的进制数
from PyQt5.Qt import *
import sys
from Utils.ConvertUtils import Convert
APP_NAME = "进制转换"
# 默认宽高
DEF_WIDTH: int = 600
DEF_HEIGHT: int = 200
TYPE_BASE_2: int = 2
TYPE_BASE_4: int = 4
TYPE_BASE_8: int = 8
TYPE_BASE_10: int = 10
TYPE_BASE_16: int = 16
BASE_LIST = [TYPE_BASE_2, TYPE_BASE_4, TYPE_BASE_8, TYPE_BASE_10, TYPE_BASE_16]
KEY_RB_TYPE: str = "rb_type"
class HomeMainUI(QWidget):
def __init__(self) -> None:
super().__init__()
self.root_layout = None
self.from_layout = None
self.to_layout = None
self.from_edit_layout = None
self.to_edit_layout = None
self.from_title_edit: QLineEdit = None
self.to_title_edit: QLineEdit = None
self.from_QButtonGroup: QButtonGroup = None
self.to_QButtonGroup: QButtonGroup = None
self.typeFrom: int = TYPE_BASE_10
self.typeTo: int = TYPE_BASE_16
self.resize(self.onWidth(), self.onHeight())
self.onStart()
self.onLayoutInit()
self.onLayoutBind()
def onWidth(self) -> int:
return DEF_WIDTH
def onHeight(self) -> int:
return DEF_HEIGHT
def onStart(self):
self.setCenter()
def setCenter(self):
mScreen = QDesktopWidget().screenGeometry()
mSize = self.geometry()
self.move(
(mScreen.width() - mSize.width()) // 2,
(mScreen.height() - mSize.height()) // 2,
)
def onLayoutInit(self):
self.root_layout = QVBoxLayout(self)
self.from_layout = QHBoxLayout()
self.to_layout = QHBoxLayout()
self.root_layout.setContentsMargins(20, 30, 20, 30)
self.root_layout.addLayout(self.from_layout)
# input edit Layout
self.from_edit_layout = QHBoxLayout()
self.root_layout.addLayout(self.from_edit_layout)
self.root_layout.addLayout(self.to_layout)
# to edit Layout
self.to_edit_layout = QHBoxLayout()
self.root_layout.addLayout(self.to_edit_layout)
# 把UI挤到最顶部
self.root_layout.addStretch()
self.from_QButtonGroup = QButtonGroup(self.from_layout)
for item_rb in BASE_LIST:
rb = self.getFromCheckButton(item_rb, self.typeFrom)
self.from_layout.addWidget(rb)
self.from_QButtonGroup.addButton(rb, rb.property(KEY_RB_TYPE))
self.from_layout.addStretch()
# 输入框
from_title_QLabel = QLabel("原始数字:")
from_title_QLabel.setFont(QFont("黑体", 15))
self.from_edit_layout.addWidget(from_title_QLabel)
self.from_title_edit = QLineEdit()
self.from_title_edit.setPlaceholderText("输入数字")
edit_QMargins = QMargins()
edit_QMargins.setTop(10)
edit_QMargins.setBottom(10)
edit_QMargins.setLeft(20)
self.from_title_edit.setTextMargins(edit_QMargins)
self.from_title_edit.setFont(QFont("黑体", 16))
self.from_title_edit.setClearButtonEnabled(True)
self.from_edit_layout.addWidget(self.from_title_edit, 1, Qt.AlignVCenter)
self.to_QButtonGroup = QButtonGroup(self.to_layout)
for item_rb in BASE_LIST:
rb = self.getFromCheckButton(item_rb, self.typeTo)
self.to_layout.addWidget(rb)
self.to_QButtonGroup.addButton(rb, rb.property(KEY_RB_TYPE))
self.to_layout.addStretch()
# 输出框
to_title_QLabel = QLabel("结果数字:")
to_title_QLabel.setFont(QFont("黑体", 15))
self.to_edit_layout.addWidget(to_title_QLabel)
self.to_title_edit = QLineEdit()
self.to_title_edit.setPlaceholderText("输入数字")
to_QMargins = QMargins()
to_QMargins.setTop(10)
to_QMargins.setBottom(10)
to_QMargins.setLeft(20)
self.to_title_edit.setTextMargins(to_QMargins)
self.to_title_edit.setFont(QFont("黑体", 16))
self.to_title_edit.setReadOnly(True)
self.to_edit_layout.addWidget(self.to_title_edit, 1, Qt.AlignVCenter)
def onLayoutBind(self):
self.from_title_edit.textChanged.connect(self.onTextEditChange)
self.from_QButtonGroup.buttonClicked[int].connect(self.onFromCheckChange)
self.to_QButtonGroup.buttonClicked[int].connect(self.onToCheckChange)
def onTextEditChange(self, textStr):
if len(textStr) > 0:
outStr = self.convertCore(int(textStr))
self.to_title_edit.setText(outStr)
else:
self.to_title_edit.setText("")
# 原始的进制类型
def onFromCheckChange(self, action: int):
self.typeFrom = action
self.onTextEditChange(self.from_title_edit.text())
# 目标进制转换类型
def onToCheckChange(self, action: int):
self.typeTo = action
self.onTextEditChange(self.from_title_edit.text())
# 进制转换
def convertCore(self, num: int) -> str:
try:
temp_number = num
if self.typeFrom != TYPE_BASE_10:
temp_number = int(str(temp_number), self.typeFrom)
if self.typeTo == TYPE_BASE_16:
return Convert.Convert10by16(temp_number)
elif self.typeTo == TYPE_BASE_8:
return Convert.Convert10by8(temp_number)
elif self.typeTo == TYPE_BASE_2:
return Convert.Convert10by2(temp_number)
elif self.typeTo == TYPE_BASE_10:
return Convert.Convert10by10(temp_number)
except ValueError:
return "Nan"
def setWindowTitleHide(self):
# 隐藏标题栏
self.setWindowFlag(Qt.FramelessWindowHint)
def getFromCheckButton(self, index: int, def_select: int = TYPE_BASE_10) -> QRadioButton:
text_str = self.getBaseTextStr(index)
rb = QRadioButton(text_str)
rb.setChecked(def_select == index)
rb.setProperty(KEY_RB_TYPE, index)
rb.setFont(QFont("黑体", 15, 300))
return rb
def getBaseTextStr(self, number: int) -> str:
return str(number) + "进制"
if __name__ == '__main__':
mApp = QApplication(sys.argv)
mHomeMainUI = HomeMainUI()
mHomeMainUI.setWindowTitle(APP_NAME)
mHomeMainUI.show()
sys.exit(mApp.exec_())
进制转换核心代码
class Convert:
@staticmethod
def Convert10by2(num):
"""
10进制转2进制
:param num:十进制数
:return: str
"""
return Convert.convert10ByX(num, 2)
@staticmethod
def Convert10by4(num):
"""
10进制转4进制
:param num:十进制数
:return: str
"""
return Convert.convert10ByX(num, 4)
@staticmethod
def Convert10by8(num):
"""
10进制转8进制
:param num:十进制数
:return: str
"""
return Convert.convert10ByX(num, 8)
@staticmethod
def Convert10by10(num):
"""
10进制转8进制
:param num:十进制数
:return: str
"""
return Convert.convert10ByX(num, 10)
@staticmethod
def Convert10by16(num):
"""
10进制转16进制
:param num:十进制数
:return: str
"""
return Convert.convert10ByX(num, 16)
@staticmethod
def convert10ByX(num, x):
# num为待转换的十进制数,x为机制,取值为2-16
base = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'b', 'C', 'D', 'E', 'F']
out = []
while True:
s = num // x # 商
y = num % x # 余数
out = out + [y]
if s == 0:
break
num = s
out.reverse()
out_str = ""
for i in out:
out_str = out_str + str(base[i])
return out_str
总结:逻辑部分都是非常简单,练手部分是UI的纯代码编写,毕竟拖拽的Qt Ds不怎么会用
完成后的效果图:
完美 收工!!!!!!