提交 955155c6 编写于 作者: 编程深海AiKoder's avatar 编程深海AiKoder 🚴🏻

init PyQt6 app

上级 f583c58d
.vscode
\ No newline at end of file
# nrfx_tool
nRF52xxx蓝牙DFU烧录包制作和固件烧录工具
\ No newline at end of file
import wx
from settings import Settings
import webbrowser
class About(wx.Panel):
'''About'''
def __init__(self, parent):
super(About, self).__init__(parent)
self.settings = Settings()
self.init_ui()
def init_ui(self):
#------------------------------------
# 子部件
title = wx.StaticText(self, label='Title:')
title_value = wx.StaticText(self)
title_value.SetLabelText(self.settings.name)
version = wx.StaticText(self, label='Version:')
version_value = wx.StaticText(self)
version_value.SetLabelText(self.settings.version)
author = wx.StaticText(self, label='Author:')
author_value = wx.StaticText(self)
author_value.SetLabelText(self.settings.author)
btn = wx.Button(self, label='Get source code')
btn.Bind(wx.EVT_BUTTON, self.get_source_handler)
#------------------------------------
# 布局
gbs = wx.GridBagSizer(0, 0)
gbs.Add(title, pos=(0, 0), flag=wx.EXPAND | wx.ALL, border=10)
gbs.Add(title_value, pos=(0, 1), flag=wx.EXPAND | wx.ALL, border=10)
gbs.Add(version, pos=(1, 0), flag=wx.EXPAND | wx.ALL, border=10)
gbs.Add(version_value, pos=(1, 1), flag=wx.EXPAND | wx.ALL, border=10)
gbs.Add(author, pos=(2, 0), flag=wx.EXPAND | wx.ALL, border=10)
gbs.Add(author_value, pos=(2, 1), flag=wx.EXPAND | wx.ALL, border=10)
gbs.Add(btn,
pos=(3, 0),
span=(0, 2),
flag=wx.EXPAND | wx.ALL,
border=10)
#------------------------------------
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(gbs)
self.SetSizerAndFit(sizer)
def get_source_handler(self, e):
webbrowser.open(self.settings.url)
#!/usr/bin/env python
import wx
import subprocess
from log_utils import LogUtils
from programmer import Programmer
from dfu_image_generator import DfuImageGenerator
from settings import Settings
from about import About
from wx.lib.embeddedimage import PyEmbeddedImage
title_icon = PyEmbeddedImage(
b'iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAAXNSR0IArs4c6QAAC7VJREFU'
b'eF7tnW2MVFcZx58z020x1nZnLVljTElMaMSQLtZYEmNaYHeJxGgaa2eAbUuUztT2Q1HbqAjf'
b'pC8aS2PTGJmFGikLzDRVYmMkZXlr/EBVotgGiHyiJURCw6xoaIGde8ySvkXqMvfOnDPnPvfH'
b'V+59Xn7/+5uZe3cWjIjkhD8QgMCHEjAIwpUBgf9PAEG4OiAwDQEE4fKAAIJwDUAgGQHeQZJx'
b'46yMEECQjATNmskIIEgybpyVEQIIkpGgWTMZAQRJxo2zMkIAQTISNGsmI4AgybhxVkYIIEhG'
b'gmbNZAQyK8gNG+7un7x+xrCY3M1GpN8a229Erk6GUddZVuSCseaUFTmVE/unC+ff3vefe597'
b'U9eWrW2TOUGuHysvyl1lHhIjX20NEUddImDlxWjSPv2vkdE9WSKSKUF6t5erJmdWZingTu9q'
b'I7tpYulopdN1Q62XGUEKtcrvxciXQw0iXXPZvzeKo59L18zJps2EIIV6pZkMD2dNR6BRrOa1'
b'E1IvSKFe/quIuVl7kF3Zz8rORqn6la709tRUtSDcc7i/irTfk6gV5NLTqh6zy/0lQofooh3W'
b'+nRLrSCFWmUHj3I9yWvlxUapeoenbl7bqBTk2s333NAz4yOnvJLMeLN849wn37x/izrmKgXp'
b'q5W/YY2pZfya9bq+jaIVE0s3bvHa1EMzlYL01io/NUYe9sCPFu8QsFaenChVv68NiEpBCrXK'
b'r8XI3drCCnofK1sapeqKoGdMMJxKQXrr5Z1GzHA8HnZ/vOO1H21uj7OhFbtrojiq7psKKgUp'
b'1Mt7ROIFLGL3N4qji+JcFFqPhd/7ySLIeywQ5F0UCIIgH/LijyAIcvllwTsI7yCXXRW8g/AO'
b'wjvINDdQCIIgCIIgLT1j4SMWH7H4iDWNKgiCIAiCIK28m/IUi6dYPMWaxhQEQRAEQZAW3kx5'
b'isVTLJ5i8RSrhZcKEW7SuUnnJp2b9FZeLLgH4R6EexDuQVp4reAehHsQ7kG4B2nhpYJ7kA9A'
b'4iMWH7H4iMVHrBZeN/mIxUcsPmLxEauFl4oOf8Q6v2XwMzkj/S11dnjQvT2feOrfkh+I0+Jj'
b'0jy0+eI/vxvnHK3HppnfW1F08rp79h7rVDZt/xzk4tjgovxV8pAx5osi8vFODUYdCLRB4LS1'
b'9kBzUp7uGdnd1n/405Ygze2D1Rz/IU0bOXKqawJRZDfll+5O/B/+JBakWRt8JGfMT1wvSH0I'
b'tEsgiuTB/NLxDUnqJBLkwnOL5vVck5v6d6SuTdKUcyDgmcDZc2/Jgo+uGD8Ut28iQSa3Dd6X'
b'z5tERsYdkOMh0AkCF5t21dXLdj8Tt1YiQZrbh57J5eSBuM04HgLdIhBZeTZfGi/H7Z9IkKg+'
b'tMeIxPqnKeMOxvEQ6CQBK7I/VxyP/S9nIkgnU6BWsAQQJNhoGCwEAggSQgrMECwBBAk2GgYL'
b'gQCChJACMwRLAEGCjYbBQiCAICGkwAzBEkCQYKNhsBAIIEgIKTBDsAQQJNhoGCwEAggSQgrM'
b'ECwBBAk2GgYLgQCChJACMwRLAEGCjYbBQiCAICGkwAzBEkCQYKNhsBAIIEgIKTBDsAQQJNho'
b'GCwEAggSQgrMECwBBAk2GgYLgQCChJACMwRLAEGCjYbBQiCAICGkwAzBEkCQYKNhsBAIIEgI'
b'KTBDsAQQJNhoGCwEAggSQgrMECwBBAk2GgYLgQCChJACMwRLAEGCjYbBQiCAICGkwAzBEkCQ'
b'YKNhsBAIIEgIKTBDsAQQJNhoGCwEAggSQgrMECwBBAk2GgYLgQCChJACMwRLAEGCjYbBQiCA'
b'ICGkwAzBEkAQn9H0f16kcJNI76dFZhR8do7f69xpkcYxkbPHRU4djH++kjMQxFeQc5aLzP2m'
b'r26d7fP6XpFXHutszZRUQxAfQd21y0cX9z2eH3bfI7AOCOI6kPk/Erlxoesufuq/9iuRI1v9'
b'9AqkC4K4DGLqnuO2J1x28F/75R9m6p4EQVxeYrO/LjLvAZcd/Nd+9VmRo9v89+1SRwRxCf7W'
b'H4jMGnLZwX/tN/aJHHjUf98udfQqSLM2uDlnzEiXdvXfdsHPRGYO+O/rsuPpQyL7HnHZIaja'
b'kZV6vjS+LO5QRkRycU9qbhtalcvL+rjnpfZ4BEltdO8OHlm7Jl/aHftGMpEgb48tHL6mJ78z'
b'9dRaXQBBWiUV7HHnJ+2SGct3vxR3wESCTDVp1gbHcsYsjdswlccjSCpje+/dQ2Rtvjj+eJIl'
b'Egsy1czWh5pJmqbuHARJXWQfHNgUx/NJF2hLkEvvJPWh1TmRdUkHSMV5CJKKmP53yMja7fnS'
b'7rYeJrUtyNRQb28dXNyTl1tEzIAx0p9KmtMMbYZ+MSCF2b2q9mocm7DjDx5StdPUpxprT0hk'
b'Dl6MmodnjOxt+7tBHRFEG+TLXomiaI8x5nZNe1pr9+dyuUWadnKxC4K0QDVCkBYo6TwEQVrI'
b'FUFagKT0EARpIVgEaQGS0kMQpIVgEaQFSEoPQZAWgkWQFiApPaQjgvRtXbnY5s2lx7yi8DHv'
b'3qE1AwOFWaoe8x5qHJ9YOP6ouse8YuWEjczBXGQPnxkZ7f5j3kK9slqU/6Dwdwseli/NvEnV'
b'a+QfT/9DvrbvSVU7XbaMle2NUrV7Pygs1CuZ+KoJgqTbo0ax6v+rJoVaZUyMZOLLigiSbkFE'
b'ZG2jWPX3ZcW+sfKw7TGZ+bo7gqReEDGTzSVnlm/y83X33m2VVSZDvzCFIOkXRGy0plHa6OcX'
b'pgq18mbJ0K/cIogGQWy9URr18yu3hXp5j4iuL+9Ndwn88tZvSXHWfAVXyfsr/PaNv8jKA6Oq'
b'dpp+Gbu/URyN/eXMRD8HyZog3549KI/NK6q6mH786g556ugfVO2EIF2Kc0H/HPnNbd/pUnc3'
b'be98+eey99RhN8WDrMo7iNNYRuffJ3fe+AWnPXwVX/faDll/JEvvHlNkEcT59XXmrg3Oe/ho'
b'0Pf8/T7aBNYDQbwE8r05S2Tt3Du89Op0kxde/7OUX9nY6bIpqYcg3oJa2P9ZmVeYJXN7PyUz'
b'Z1znrW+SRifPNeRvjeNy9OxJ2XfqSJISSs5BECVBsoYbAgjihitVlRBAECVBsoYbAgjihitV'
b'lRBAECVBsoYbAgjihitVlRBAECVBsoYbAgjihitVlRBAECVBsoYbAgjihitVlRBAECVBsoYb'
b'AgjihitVlRBAECVBsoYbAgjihitVlRBAECVBsoYbAgjihitVlRBAECVBsoYbAgjihitVlRBA'
b'ECVBsoYbAgjihitVlRBAECVBsoYbAgjihitVlRBAECVBsoYbAgjihitVlRBAECVBsoYbAgji'
b'hitVlRBAECVBsoYbAgjihitVlRBAECVBsoYbAgjihitVlRBAECVBsoYbAgjihitVlRBAECVB'
b'soYbAgjihitVlRBAECVBsoYbAgjihitVlRBAECVBsoYbAgjihitVlRBAECVBsoYbAgjihitV'
b'lRBAECVBsoYbAgjihitVlRBAECVBsoYbAgjihitVlRBAECVBsoYbAgjihitVlRBAECVBsoYb'
b'AgjihitVlRBAECVBsoYbAgjihitVlRBAECVBsoYbAgjihitVlRBAECVBsoYbAj4FqZU3izEj'
b'bhahKgQcELC23iiNLotb2YhILu5Jvdsqq0xe1sc9j+Mh0DUCNlrTKG18Im7/RIL0jZWHbY/Z'
b'GbcZx0OgWwTMZHPJmeWbXorbP5EgU00KtcqYGFkatyHHQ6ALBNY2itXHk/RNLMglSeqVZpKm'
b'nAMBnwQaxWo+ab+2BHlHktUisi7pAJwHAWcErGxvlKptPUxqW5Cp5fq2rlxs8+YWETMgRvqd'
b'LUxhCFyJgJUTNjIHc5E9fGZkdNeVDr/S33dEkCs14e8hkFYCCJLW5JjbCwEE8YKZJmklgCBp'
b'TY65vRBAEC+YaZJWAgiS1uSY2wsBBPGCmSZpJYAgaU2Oub0QQBAvmGmSVgIIktbkmNsLAQTx'
b'gpkmaSWAIGlNjrm9EEAQL5hpklYC/wW+p4KkFYXPKQAAAABJRU5ErkJggg==')
class TabTwo(wx.Panel):
def __init__(self, parent):
super(TabTwo, self).__init__(parent)
text = wx.TextCtrl(self, style=wx.TE_MULTILINE, size=(250, 150))
class NrfxTool(wx.Frame):
"""hold all widgets"""
def __init__(self, parent):
super(NrfxTool, self).__init__(parent,
style=wx.DEFAULT_FRAME_STYLE
& ~(wx.RESIZE_BORDER | wx.MAXIMIZE_BOX))
self.settings = Settings()
self.SetIcon(title_icon.getIcon())
self.SetTitle(self.settings.title)
self.init_ui()
self.welcome_message()
def init_ui(self):
vbox = wx.BoxSizer(wx.VERTICAL)
#----------------------------------------
# 设置区域
self.nb = wx.Notebook(self)
self.nb.AddPage(Programmer(self.nb), "Programmer")
self.nb.AddPage(DfuImageGenerator(self.nb), "DFU Image Generater")
self.nb.AddPage(About(self.nb), "About")
#----------------------------------------
# log显示区域
btn_hbox = wx.BoxSizer(wx.HORIZONTAL)
self.log_clear_btn = wx.Button(self, label='CLEAR LOG')
self.log_open_btn = wx.Button(self, label='OPEN LOG FILE')
self.log_clear_btn.Bind(wx.EVT_BUTTON, self.log_clear_btn_handler)
self.log_open_btn.Bind(wx.EVT_BUTTON, self.log_open_btn_handler)
btn_hbox.Add(self.log_clear_btn, flag=wx.EXPAND | wx.ALL)
btn_hbox.Add(self.log_open_btn, flag=wx.EXPAND | wx.ALL)
self.log_text = wx.TextCtrl(self,
style=wx.TE_MULTILINE | wx.TE_READONLY
| wx.VSCROLL)
vbox.Add(self.nb)
vbox.Add(btn_hbox)
vbox.Add(self.log_text, proportion=1, flag=wx.EXPAND | wx.ALL)
self.SetSizerAndFit(vbox)
self.SetSize(self.settings.size)
self.Centre()
self.Show(True)
# 实例化log模块,绑定输出到log显示区域
self.logger = LogUtils.sharedInstance('1')
LogUtils.sharedInstance('nrfx_tool').set_ctrl_to_logging(self.log_text)
self.logger.set_logger('nrfx_tool', 'logs')
#print(self.nb.GetSize())
def log_clear_btn_handler(self, e):
self.log_text.Clear()
def log_open_btn_handler(self, e):
log_file = self.logger.get_current_log_file()
print('Log file: %s' % (log_file))
subprocess.Popen(r'explorer "logs"')
def welcome_message(self):
self.logger.info('Check for updates: %s' % self.settings.url)
def main():
app = wx.App()
frame = NrfxTool(None)
app.MainLoop()
if __name__ == "__main__":
main()
# -*- coding:utf-8 -*-
import wx
from log_utils import LogUtils
class TabKey(wx.Panel):
def __init__(self, parent):
super(TabKey, self).__init__(parent)
gen_btn = wx.Button(self, label='Generate', size=(100, 35))
dis_btn = wx.Button(self, label='Display', size=(100, 35))
clear_btn = wx.Button(self, label='Reset', size=(100, 35))
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(gen_btn, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)
vbox.Add(dis_btn, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)
vbox.Add(clear_btn, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)
self.SetSizerAndFit(vbox)
class TabBlSetting(wx.Panel):
def __init__(self, parent):
super(TabBlSetting, self).__init__(parent)
#------------------------------------
# 子部件
family_title = wx.StaticText(self, label='--family')
self.family_cb = wx.ComboBox(self,
choices=['NRF52'],
value='NRF52',
style=wx.CB_READONLY)
boot_version_title = wx.StaticText(self, label='--bootloader-version')
self.boot_version_text = wx.TextCtrl(self, value='1')
bl_setting_version_title = wx.StaticText(self,
label='--bl-setting-version')
self.bl_setting_version_cb = wx.ComboBox(self,
choices=['2'],
value='2',
style=wx.CB_READONLY)
app_version_title = wx.StaticText(self, label='--application-version')
self.app_version_text = wx.TextCtrl(self, value='10')
app_title = wx.StaticText(self, label='--application')
self.app_path = wx.TextCtrl(self, style=wx.TE_READONLY)
self.app_load_btn = wx.Button(self, label='...')
self.reset_btn = wx.Button(self, label='Reset')
self.generator_btn = wx.Button(self, label='Generate')
#------------------------------------
# 布局
self.gbs = wx.GridBagSizer(0, 0)
self.gbs.Add(family_title,
pos=(0, 0),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.family_cb,
pos=(0, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(boot_version_title,
pos=(1, 0),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.boot_version_text,
pos=(1, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(bl_setting_version_title,
pos=(2, 0),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.bl_setting_version_cb,
pos=(2, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(app_version_title,
pos=(3, 0),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.app_version_text,
pos=(3, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(app_title, pos=(4, 0), flag=wx.EXPAND | wx.ALL, border=5)
self.gbs.Add(self.app_path,
pos=(4, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.app_load_btn,
pos=(4, 2),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.reset_btn,
pos=(5, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.generator_btn,
pos=(5, 2),
flag=wx.EXPAND | wx.ALL,
border=5)
#------------------------------------
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.gbs)
self.SetSizerAndFit(sizer)
class TabDfuPackage(wx.Panel):
def __init__(self, parent):
super(TabDfuPackage, self).__init__(parent)
#------------------------------------
# 子部件
hw_version_title = wx.StaticText(self, label='--hw-version')
self.hw_version_cb = wx.ComboBox(self,
choices=['52'],
value='52',
style=wx.CB_READONLY)
sd_seq_title = wx.StaticText(self, label='--sd-req')
self.sd_seq_cb = wx.ComboBox(self,
choices=['0x101'],
value='0x101',
style=wx.CB_READONLY)
app_version_title = wx.StaticText(self, label='--application-version')
self.app_version_text = wx.TextCtrl(self, value='1')
app_title = wx.StaticText(self, label='--application')
self.app_path = wx.TextCtrl(self, style=wx.TE_READONLY)
self.app_load_btn = wx.Button(self, label='...')
key_file_title = wx.StaticText(self, label='--key-file')
self.key_file_path = wx.TextCtrl(self, style=wx.TE_READONLY)
self.key_file_load_btn = wx.Button(self, label='...')
self.reset_btn = wx.Button(self, label='Reset')
self.generator_btn = wx.Button(self, label='Generate')
#------------------------------------
# 布局
self.gbs = wx.GridBagSizer(0, 0)
self.gbs.Add(hw_version_title,
pos=(0, 0),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.hw_version_cb,
pos=(0, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(sd_seq_title,
pos=(1, 0),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.sd_seq_cb,
pos=(1, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(app_version_title,
pos=(2, 0),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.app_version_text,
pos=(2, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(app_title, pos=(3, 0), flag=wx.EXPAND | wx.ALL, border=5)
self.gbs.Add(self.app_path,
pos=(3, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.app_load_btn,
pos=(3, 2),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(key_file_title,
pos=(4, 0),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.key_file_path,
pos=(4, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.key_file_load_btn,
pos=(4, 2),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.reset_btn,
pos=(5, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.generator_btn,
pos=(5, 2),
flag=wx.EXPAND | wx.ALL,
border=5)
#------------------------------------
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.gbs)
self.SetSizerAndFit(sizer)
class TabMergingFile(wx.Panel):
def __init__(self, parent):
super(TabMergingFile, self).__init__(parent)
#------------------------------------
# 子部件
sd_title = wx.StaticText(self, label='softdevice')
self.sd_path = wx.TextCtrl(self, style=wx.TE_READONLY)
self.sd_load_btn = wx.Button(self, label='...')
boot_title = wx.StaticText(self, label='bootloader')
self.boot_path = wx.TextCtrl(self, style=wx.TE_READONLY)
self.boot_load_btn = wx.Button(self, label='...')
app_title = wx.StaticText(self, label='application')
self.app_path = wx.TextCtrl(self, style=wx.TE_READONLY)
self.app_load_btn = wx.Button(self, label='...')
settings_title = wx.StaticText(self, label='settings')
self.settings_path = wx.TextCtrl(self, style=wx.TE_READONLY)
self.settings_load_btn = wx.Button(self, label='...')
self.reset_btn = wx.Button(self, label='Reset')
self.generate_btn = wx.Button(self, label='Generate')
#------------------------------------
# 布局
self.gbs = wx.GridBagSizer(0, 0)
self.gbs.Add(sd_title, pos=(0, 0), flag=wx.EXPAND | wx.ALL, border=5)
self.gbs.Add(self.sd_path,
pos=(0, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.sd_load_btn,
pos=(0, 2),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(boot_title, pos=(1, 0), flag=wx.EXPAND | wx.ALL, border=5)
self.gbs.Add(self.boot_path,
pos=(1, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.boot_load_btn,
pos=(1, 2),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(app_title, pos=(2, 0), flag=wx.EXPAND | wx.ALL, border=5)
self.gbs.Add(self.app_path,
pos=(2, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.app_load_btn,
pos=(2, 2),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(settings_title,
pos=(3, 0),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.settings_path,
pos=(3, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.settings_load_btn,
pos=(3, 2),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.reset_btn,
pos=(4, 1),
flag=wx.EXPAND | wx.ALL,
border=5)
self.gbs.Add(self.generate_btn,
pos=(4, 2),
flag=wx.EXPAND | wx.ALL,
border=5)
#------------------------------------
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.gbs)
self.SetSizerAndFit(sizer)
class DfuImageGenerator(wx.Panel):
'''DFU升级文件制作'''
def __init__(self, parent):
super(DfuImageGenerator, self).__init__(parent)
# 实例化log模块
self.logger = LogUtils.sharedInstance('3')
self._init_ui()
def _init_ui(self):
''''''
# 定义选项卡
nb = wx.Notebook(self)
tab1 = TabKey(nb)
tab2 = TabBlSetting(nb)
tab3 = TabDfuPackage(nb)
tab4 = TabMergingFile(nb)
nb.AddPage(tab1, 'Cryptographic Key')
nb.AddPage(tab2, 'BL setting')
nb.AddPage(tab3, 'DFU packages')
nb.AddPage(tab4, 'Merging file')
vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(nb, flag=wx.EXPAND | wx.ALL)
self.SetSizerAndFit(vbox)
self.Centre()
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow
class NrfxToolbox(QMainWindow):
def __init__(self):
super().__init__()
self.initUi()
def initUi(self):
self.resize(400, 600)
self.setWindowTitle('NrfxToolbox')
self.show()
def main():
app = QApplication(sys.argv)
nrfxtoolbox = NrfxToolbox()
sys.exit(app.exec())
if __name__ == '__main__':
main()
\ No newline at end of file
#!/usr/bin/env python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# --------------------------------------------------------------------------------------------------------------------------------
# Class: Img2Python
# Platform: WINNT
# Comments: Convert all ico to python file for the selected folder
# User: JustDoIT
# Date: 6th Dec, 2016
# --------------------------------------------------------------------------------------------------------------------------------
import wx, os, sys, subprocess
#import img
from wx.tools.img2py import img2py
# --------------------------------------------------------------------------------------------------------------------------------
# Class: Img2Python
# --------------------------------------------------------------------------------------------------------------------------------
class Img2Python(wx.Frame):
def __init__(self, *args, **kwargs):
super(Img2Python, self).__init__(*args, **kwargs)
self.Size = wx.Size(550, 435)
self.SetIcon(img.app.getIcon())
self.InitUI()
self.Centre()
self.Show()
def InitUI(self):
panel = wx.Panel(self)
sizer = wx.GridBagSizer(5, 5)
text1 = wx.StaticText(panel, label="Image to python")
text1.SetFont(wx.Font(16, wx.DEFAULT, wx.ITALIC, wx.NORMAL))
sizer.Add(text1,
pos=(0, 0),
span=(1, 4),
flag=wx.LEFT | wx.TOP | wx.RIGHT,
border=5)
icon = wx.StaticBitmap(panel, bitmap=img.conf32.getBitmap())
sizer.Add(icon,
pos=(0, 4),
flag=wx.TOP | wx.RIGHT | wx.ALIGN_RIGHT,
border=5)
line = wx.StaticLine(panel)
sizer.Add(line,
pos=(1, 0),
span=(1, 5),
flag=wx.EXPAND | wx.BOTTOM,
border=0)
# -------------------------------------------------------------------------------------------------------------------------------
self.txtdir = wx.TextCtrl(panel,
value='Select directory ...',
style=wx.TE_LEFT | wx.TE_READONLY)
self.btndir = wx.Button(panel, wx.ID_HOME, label='Browser')
sizer.Add(self.txtdir,
pos=(2, 0),
span=(1, 4),
flag=wx.LEFT | wx.TOP | wx.EXPAND,
border=5)
sizer.Add(self.btndir, pos=(2, 4), flag=wx.TOP | wx.EXPAND, border=5)
self.btndir.Bind(wx.EVT_BUTTON, self.OnButton)
# Attribute choice -------------------------------------------------------------------------------------------------------------
attbox = wx.BoxSizer(wx.HORIZONTAL)
nflag = wx.CheckBox(panel, label='-n')
mflag = wx.CheckBox(panel, label='-m')
iflag = wx.CheckBox(panel, label='-i')
fflag = wx.CheckBox(panel, label='-f')
attbox.Add(nflag, flag=wx.LEFT | wx.RIGHT, border=5)
attbox.Add(mflag, flag=wx.LEFT | wx.RIGHT, border=15)
attbox.Add(iflag, flag=wx.LEFT | wx.RIGHT, border=15)
attbox.Add(fflag, flag=wx.LEFT | wx.RIGHT, border=15)
sizer.Add(attbox,
pos=(3, 0),
span=(1, 5),
flag=wx.TOP | wx.BOTTOM | wx.EXPAND,
border=0)
# ------------------------------------------------------------------------------------------------------------------------------
sb = wx.StaticBox(panel, label='File Log')
sboxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL)
self.outstr = wx.TextCtrl(panel,
size=(525, 160),
style=wx.TE_MULTILINE | wx.TE_READONLY
| wx.HSCROLL | wx.VSCROLL)
sboxsizer.Add(self.outstr, proportion=1, flag=wx.EXPAND)
sizer.Add(sboxsizer,
pos=(4, 0),
span=(1, 5),
flag=wx.LEFT | wx.EXPAND | wx.BOTTOM,
border=5)
line2 = wx.StaticLine(panel)
sizer.Add(line2,
pos=(6, 0),
span=(1, 5),
flag=wx.BOTTOM | wx.EXPAND,
border=5)
# ------------------------------------------------------------------------------------------------------------------------------
btnhelp = wx.Button(panel, 301, label='Open')
btnok = wx.Button(panel, 302, label='OK')
btncancel = wx.Button(panel, 303, label='Cancel')
sizer.Add(btnhelp, pos=(7, 0), flag=wx.EXPAND | wx.BOTTOM, border=10)
sizer.Add(btnok, pos=(7, 3), flag=wx.EXPAND | wx.BOTTOM, border=10)
sizer.Add(btncancel, pos=(7, 4), flag=wx.EXPAND | wx.BOTTOM, border=10)
btnhelp.Bind(wx.EVT_BUTTON, self.OnButton)
btnok.Bind(wx.EVT_BUTTON, self.OnButton)
btncancel.Bind(wx.EVT_BUTTON, self.OnButton)
# ------------------------------------------------------------------------------------------------------------------------------
sizer.AddGrowableCol(0)
sizer.AddGrowableRow(4)
panel.SetSizer(sizer)
def OnButton(self, e):
eid = e.GetId()
if eid == wx.ID_HOME:
dlg = wx.DirDialog(self,
'Select forder',
style=wx.DD_DEFAULT_STYLE)
if dlg.ShowModal() == wx.ID_OK:
self.txtdir.SetValue(dlg.GetPath())
print(self.txtdir)
dlg.Destroy()
elif eid == 301:
if os.path.isdir(self.txtdir.GetValue()):
subprocess.Popen('explorer ' + self.txtdir.GetValue())
else:
wx.MessageBox('Pls select correct image folder !', 'Error',
wx.OK | wx.ICON_ERROR)
elif eid == 302:
if os.path.isdir(self.txtdir.GetValue()):
self.forderprocess()
else:
wx.MessageBox('Pls select correct image folder !', 'Error',
wx.OK | wx.ICON_ERROR)
elif eid == 303:
self.Close()
else:
e.Skip()
def forderprocess(self):
folder = self.txtdir.GetValue()
listext = ('.png', '.ico', '.icon', '.gif')
pyfile = folder + '\img.py'
if os.path.isdir(folder):
self.outstr.AppendText(
'Starting.................................................................................\n\n'
)
for name in os.listdir(folder):
(x, ext) = os.path.splitext(name)
if ext in listext:
img = os.path.join(folder, name)
fs = open('log.txt', 'w')
temp = sys.stdout
sys.stdout = fs
self.outstr.AppendText('Name :' + x)
if os.path.isfile(pyfile):
ret = img2py(img, pyfile, append=True)
else:
ret = img2py(img, pyfile, append=True)
sys.stdout = temp
fs.close()
str = open('log.txt', 'r').read()
self.outstr.AppendText(str + '\n')
self.outstr.AppendText(
'Done ....................................................................................\n'
)
# --------------------------------------------------------------------------------------------------------------------------------
# Class: APP
# --------------------------------------------------------------------------------------------------------------------------------
class App(wx.App):
def OnInit(self):
defaultstyle = wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN | wx.FRAME_NO_TASKBAR
Img2Python(None, title='Image To Python', style=defaultstyle)
return True
# --------------------------------------------------------------------------------------------------------------------------------
# Function main()
# --------------------------------------------------------------------------------------------------------------------------------
def main():
App().MainLoop()
if __name__ == '__main__':
main()
\ No newline at end of file
# -*- coding:utf-8 -*-
import wx
import logging
import os
import time
from pathlib import Path
from datetime import datetime
class TextHandler(logging.Handler):
def __init__(self) -> None:
logging.Handler.__init__(self)
self.ctrl = None
def set_ctrl(self, ctrl):
self.ctrl = ctrl
def emit(self, record):
if not self.ctrl == None:
wx.CallAfter(self.ctrl.write, self.format(record) + "\n")
class LogUtils(object):
log = None
# 实现一个静态方法实例
@staticmethod
def sharedInstance(task_id):
if LogUtils.log == None:
LogUtils.log = LogUtils(task_id)
return LogUtils.log
def __init__(self, task_id) -> None:
self.logger = logging.getLogger(task_id)
self.level = logging.INFO
self.fmt = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
self.text_ctrl = None
self.text_handler = TextHandler()
def set_logger(self, task_id, log_path, log_name=''):
'''log目录设置'''
if not os.path.exists(log_path):
os.makedirs(log_path)
if log_name == '':
log_name = '%s_%s.log' % (
task_id, datetime.now().strftime("%Y%m%d_%H%M%S_%f"))
logs_folder = Path(log_path)
self.logs_path = logs_folder / log_name
print(self.logs_path)
# 文件句柄
fh = logging.FileHandler(self.logs_path)
# 设置格式
fh.setFormatter(self.fmt)
# 添加文件输出流
self.logger.addHandler(fh)
# 输出到控制台
sh = logging.StreamHandler()
# 设置格式
sh.setFormatter(self.fmt)
# 添加标准输出流
self.logger.addHandler(sh)
# 自定义log重定向
self.logger.addHandler(self.text_handler)
self.logger.setLevel(logging.INFO)
self.logger.info(u'Logging start.\n')
def info(self, s):
self.logger.info(s)
def set_ctrl_to_logging(self, text_ctrl):
self.text_ctrl = text_ctrl
if not self.text_handler == None:
self.text_handler.set_ctrl(self.text_ctrl)
def get_current_log_file(self):
return self.logs_path
from distutils.core import setup
import py2exe
includes = []
excludes = []
packages = []
mydata_files = [("", ["title.ico"])]
setup(
options={
"py2exe": {
"compressed": 2,
"optimize": 2,
"includes": includes,
"excludes": excludes,
"packages": packages,
"bundle_files": 1,
"dist_dir": "dist",
"xref": False,
"skip_archive": False,
"ascii": False,
"custom_boot_script": "",
}
},
console=[{
"script": "app.py",
"icon_resources": [(1, "title.ico")],
"dest_base": "nrfx_toolbox",
}],
name="Gavin",
version="1.0.2",
data_files=mydata_files,
zipfile=None,
)
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['app.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='nrfx-toolbox',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None , icon='title.ico')
此差异已折叠。
class Settings:
def __init__(self) -> None:
self.version = '1.0.2'
self.name = 'nRF Toolbox'
self.author = 'Gavin'
self.title = 'nRF Toolbox v' + self.version + ' by ' + self.author
self.url = 'https://codechina.csdn.net/areswhy/nrfx_tool.git'
self.size = (550, 650)
# programmer page
self.programmer_file_size = (530, 140)
self.programmer_file_item_border = 1
self.programmer_setting_size = (530, 140)
self.programmer_setting_item_size = (114, 25)
self.programmer_setting_item_border = 1
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册