学习PyQt5 简单实现一个进制转换的GUI小工具

主页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不怎么会用

完成后的效果图:

 

完美 收工!!!!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值