基于PyQt5的HEX文件合并工具

最近时常需要合并HEX文件,趁着端午节的闲暇做了一个合并工具,界面如下:
这里写图片描述
简单介绍一下,使用IntelHex对HEX文件进行读写和合并操作;数据地址冲突时报错并终止合并;右键 -> 文件段落,显示segments方便了解文件结构;HEX文件的Start Linear Address重写为None;使用dropEvent实现HEX文件的拖放;qss定制黑色界面。
代码如下:

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

import os
import sys
from intelhex import IntelHex
from PyQt5.QtCore import QSettings
from PyQt5.QtGui import QCursor, QFont, QFontDatabase, QIcon
from PyQt5.QtWidgets import QAction, QApplication, QFileDialog, QLabel, QMainWindow, QMenu, QMessageBox, QTableWidgetItem
from PyQt5.uic import loadUi

sys.path.append('..\\..\\MyStyleSheet')
from darkstyle import load_stylesheet_pyqt5


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        loadUi('.\\pyhexmerge.ui', self)
        self.setWindowIcon(QIcon('.\\layer.ico'))
        self.setWindowTitle(self.tr('HEX文件合并工具'))
        self.statusBar().addPermanentWidget(QLabel('Version 2018.06.22 '))
        self.tableWidget.setHorizontalHeaderLabels((self.tr('文件'), ))
        self.setAcceptDrops(True)
        # Menu
        self.menu_about = QMenu()
        self.actionAbout = QAction(QIcon('.\\about_64.png'), self.tr('关于'), self)
        self.menu_about.addAction(self.actionAbout)
        self.menu_segments = QMenu()
        self.actionSegments = QAction(QIcon('.\\layer_64.png'), self.tr('文件段落'), self)
        self.menu_segments.addAction(self.actionSegments)
        # Restore
        settings = QSettings('.\\settings.ini', QSettings.IniFormat)
        if settings.contains('geometry'):
            self.restoreGeometry(settings.value('geometry'))
        # Connect
        self.pushButton_add.clicked.connect(self._slot_add)
        self.pushButton_remove.clicked.connect(self._slot_remove)
        self.pushButton_merge.clicked.connect(self._slot_merge)
        self.tableWidget.customContextMenuRequested.connect(self._slot_show_menu_segments)
        self.customContextMenuRequested.connect(self._slot_show_menu_about)
        self.actionSegments.triggered.connect(self._slot_action_segments)
        self.actionAbout.triggered.connect(self._slot_action_about)

    def closeEvent(self, event):
        settings = QSettings('.\\settings.ini', QSettings.IniFormat)
        settings.setValue('geometry', self.saveGeometry())
        QMainWindow.closeEvent(self, event)

    def dragEnterEvent(self, event):
        if not event.mimeData().hasFormat('text/uri-list'):
            return
        else:
            for urls in event.mimeData().urls():
                if not os.path.splitext(urls.fileName())[1] == '.hex':
                    return
            event.acceptProposedAction()

    def dropEvent(self, event):
        for urls in event.mimeData().urls():
            file_path = urls.toLocalFile()
            row_count = self.tableWidget.rowCount()
            self.tableWidget.setRowCount(row_count + 1)
            self.tableWidget.setItem(row_count, 0, QTableWidgetItem(file_path))

    def _slot_add(self):
        file_path = QFileDialog.getOpenFileName(self, self.tr('打开文件'), '.\\', 'Data files (*.hex)')[0]
        if file_path:
            row_count = self.tableWidget.rowCount()
            self.tableWidget.setRowCount(row_count + 1)
            self.tableWidget.setItem(row_count, 0, QTableWidgetItem(file_path))

    def _slot_remove(self):
        items = self.tableWidget.selectedItems()
        for i in items:
            self.tableWidget.removeRow(i.row())

    def _slot_merge(self):
        row_count = self.tableWidget.rowCount()
        if row_count < 2:
            self.statusbar.showMessage(self.tr('待合并文件少于2'))
            return
        last = IntelHex()
        for x in range(row_count):
            new = IntelHex(self.tableWidget.item(x, 0).data(0))
            new.start_addr = None
            try:
                last.merge(new, overlap='error')
            except Exception as e:
                QMessageBox.warning(self, self.tr('错误信息'), str(e))
                self.statusbar.showMessage(self.tr('合并失败'))
                return
        file_path = QFileDialog.getSaveFileName(self, self.tr('保存文件'), '.\\', 'Data files (*.hex)')[0]
        if file_path:
            last.write_hex_file(file_path)
            self.statusbar.showMessage(self.tr('合并成功'))

    def _slot_show_menu_segments(self):
        if not self.tableWidget.currentItem() is None:
            self.menu_segments.exec(QCursor.pos())

    def _slot_show_menu_about(self):
        self.menu_about.exec(QCursor.pos())

    def _slot_action_segments(self):
        tmp_str = ''
        segments = IntelHex(self.tableWidget.currentItem().data(0)).segments()
        for s in segments:
            tmp_str += '(' + hex(s[0]) + ', ' + hex(s[1]) + ')\n'
        QMessageBox.information(self, self.tr('文件段落'), tmp_str)

    def _slot_action_about(self):
        QMessageBox.about(self, self.tr('关于'), self.tr('意见反馈:\n')+'yy123xiang@163.com')


app = QApplication(sys.argv)
app.setStyleSheet(load_stylesheet_pyqt5())
if os.path.exists('.\\msyh.ttf'):
    msyh = QFontDatabase.applicationFontFamilies(QFontDatabase.addApplicationFont('.\\msyh.ttf'))[0]
    font = QFont(msyh, 9)
    app.setFont(font)
w = MainWindow()
w.show()
sys.exit(app.exec_())

附上使用PyInstaller打包的可执行文件,资源地址

### 回答1: 在这里是一个基于 Python 和 PyQt5Hex 文件合成工具的简单示例代码。这个工具使用了 IntelHex 库来处理 Hex 文件,并使用 PyQt5 来创建用户界面。 首先,需要安装 IntelHex 库和 PyQt5 库。你可以使用 pip 命令来安装这两个库: ``` pip install intelhex pip install pyqt5 ``` 然后,你可以使用以下代码来创建一个简单的 Hex 文件合成工具。 ```python import sys from intelhex import IntelHex from pyqt5.QtWidgets import (QApplication, QFileDialog, QHBoxLayout, QLabel, QPushButton, QTextEdit, QVBoxLayout, QWidget) class HexMergeTool(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 创建文本编辑器,用于显示 Hex 文件内容 self.hexEdit = QTextEdit() self.hexEdit.setReadOnly(True) # 创建“打开”按钮 openBtn = QPushButton('打开') openBtn.clicked.connect(self.openHexFile) # 创建“保存”按钮 saveBtn = QPushButton('保存') saveBtn.clicked.connect(self.saveHexFile) # 创建布局并添加组件 hbox = QHBoxLayout() hbox.addWidget(openBtn) hbox.addWidget(saveBtn) vbox = QVBoxLayout() vbox.addWidget(self.hexEdit) vbox.addLayout(hbox) self.setLayout(vbox) # 设置窗口属性 self.setGeometry(300, 300, 600, 400) self.setWindowTitle('Hex 文件合成工具') self.show() def openHexFile(self): # 打开文件对话框 options = QFileDialog.Options() options |= QFileDialog.ReadOnly ### 回答2: 下面是基于Python和PyQt5Hex文件合成工具代码,运用了IntelHex库,并且可以选择保存路径: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QFileDialog from PyQt5.QtGui import QIcon from intelhex import IntelHex class HexFileTool(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle("Hex File Tool") self.setWindowIcon(QIcon("icon.png")) self.label = QLabel("选择要合成的Hex文件:", self) self.label.setGeometry(20, 20, 200, 20) self.btn_open = QPushButton("打开", self) self.btn_open.setGeometry(20, 50, 60, 30) self.btn_open.clicked.connect(self.openFile) self.btn_save = QPushButton("保存", self) self.btn_save.setGeometry(90, 50, 60, 30) self.btn_save.clicked.connect(self.saveFile) self.statusBar().showMessage("就绪") self.setGeometry(300, 300, 400, 150) self.show() def openFile(self): file, _ = QFileDialog.getOpenFileName(self, "选择Hex文件") if file: self.hexdata = IntelHex(file) self.statusBar().showMessage("已打开文件: " + file) def saveFile(self): if hasattr(self, 'hexdata'): saveFile, _ = QFileDialog.getSaveFileName(self, "保存合成的Hex文件") if saveFile: self.hexdata.write_hex_file(saveFile) self.statusBar().showMessage("已保存文件: " + saveFile) else: self.statusBar().showMessage("请先打开Hex文件") if __name__ == '__main__': app = QApplication(sys.argv) ex = HexFileTool() sys.exit(app.exec_()) ``` 这是一个简单的GUI应用程序,使用PyQt5创建窗口。它包含一个标签,显示要合成的Hex文件,以及两个按钮,用于打开和保存文件。当用户点击打开按钮时,会弹出文件选择对话框,选择要合成的Hex文件。当用户点击保存按钮时,会弹出保存文件对话框,选择保存合成后的Hex文件的路径。在保存文件时,使用IntelHex库将合成后的Hex数据写入到文件中。 ### 回答3: 基于Python和PyQt5hex文件合成工具代码运用了intelhex模块,能够选择保存路径。下面是一个例子,假设需要合成名为"file1.hex"和"file2.hex"的两个Hex文件: ```python import os from tkinter import Tk from tkinter.filedialog import askopenfilename, asksaveasfilename from intelhex import IntelHex def merge_hex_files(): # 选择需要合并的两个Hex文件 Tk().withdraw() file1_path = askopenfilename(title="选择第一个Hex文件") file2_path = askopenfilename(title="选择第二个Hex文件") # 加载两个Hex文件 ih1 = IntelHex() ih1.loadhex(file1_path) ih2 = IntelHex() ih2.loadhex(file2_path) # 合并Hex文件 ih1.merge(ih2) # 选择保存路径 save_path = asksaveasfilename(defaultextension='.hex', title="选择保存路径") # 保存合并后的Hex文件 ih1.tofile(save_path, 'hex') print("合并完成,保存路径为:", save_path) merge_hex_files() ``` 这段代码首先使用了`Tkinter`模块打开了一个选择文件的对话框,用户可以选择两个需要合并Hex文件。然后使用`intelhex`模块加载并合并这两个Hex文件。接下来,使用`Tkinter`模块打开一个选择保存路径的对话框,用户可以选择合并后的Hex文件的保存路径。最后将合并后的Hex文件保存到所选择的路径,并输出保存路径。 请注意,这段代码使用了`Tkinter`模块来创建选择文件和保存路径的对话框。如果你运行这段代码时遇到问题,请确保你的Python安装中包含了`Tkinter`模块。另外,你也可以根据自己的需要对对话框的外观和行为进行定制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值