开源硬件
Arduino
客制化键盘
Arduino_寄存器
二进制运算
寄存器+二进制运算
LCD-逐字显示
密码依次录入
等待输入
WiFi Duck(无线击键注入攻击平台)
WiFi Duc-New
WiFi Duc-Old
蓝牙无线烧录
ESP8266
ESP-NOW
ESP8266看门狗
ESP8266-休眠模式
ESP01/01S使用说明
WIFI_SD
ESP8266-Web服务器
ESP8266-WIFI自动认证
ESP32
ESP32 ADC2
ESP32_PWM
ESP32_CAM
ESP32 小坦克
ESP32_限电保护
Arduino IDE 添加 ESP32
ESP32-iPhone BLE攻击
STM32
STM32F103-虚拟键盘
STC
STC8G1K08(A)
树莓派-触摸屏
Arduino IDE
Arduino_自制库
Arduino库收集
常见排序算法
冒泡排序
选择排序
插入排序
希尔排序
归并排序
快速排序
计数排序
预处理
millis(运行时长)
Arduino IDE 2.X-修改数据位置
Mixly
Mixly安装教程
Mixly 模块介绍
Mixly-添加ESP32CAM支持
Mixly-库定制工具
模块
4G模块连接物联网
GPS模块
语音模块(JQ8900)
安信可VB语音识别
28BYJ-48(5V步进)
FreeRTOS
FreeRTOS-多任务基础
FreeRTOS-任务共享全局变量
FreeRTOS-多核多任务
FreeRTOS-MUTEX
FreeRTOS-常规程序改多任务
FreeRTOS-定时器
LaserGRBL(激光雕刻)
LaserGRBL-GRBL
GRBL-CNC Shield v4
MicroPython
Scratch
Wokwi(在线仿真)
html转无符号数组
待做开源项目
本文档使用 MrDoc 发布
-
+
首页
Mixly-库定制工具
用于生成编写的 Mixly库 的定制版本 ```python # 导入相关库 import xml.etree.ElementTree as ET # 导入用于解析XML文件的ElementTree库 import tkinter as tk # 导入Tkinter库用于创建UI界面 from tkinter import filedialog # 导入filedialog库用于选择文件 from tkinter import messagebox # 导入messagebox库用于弹窗警告 # 阶段提示 print("选择需要定制的 .xml 文件,源文件备份后操作\n仅可用于 Arduino_WJ.xml/ESP8266_WJ.xml/ESP32_WJ.xml") # 弹窗选择需要操作的XML文件 file_path = filedialog.askopenfilename(filetypes=[('XML Files', '*.xml')]) # 把文件完整路径转换成仅文件名,用作于后面头部文件判断 file_name = file_path.split('/')[-1] # 直接读取前部会有特殊内容,影响读取结构,这里直接排除,后面组合时从.txt文件中引用回来 try: with open(file_path, 'r', encoding='utf-8') as f: content = f.readlines()[5:] # 读取文件内容,排除前5行特殊内容 tree = ET.ElementTree(ET.fromstring(''.join(content))) # 解析XML文件内容并创建ElementTree对象 except: messagebox.showwarning("警告", "文件加载失败,请检查文件格式是否正确") # 如果文件加载失败则弹窗警告用户 root = tree.getroot() # 获取XML文件的根节点 # 阶段提示 print("勾选需要加载的库,选择完成后点击保存\n勾选了分组标签就别勾选分组内的子标签\n最顶级的库标签无需勾选(无效)") # 创建UI窗口 window = tk.Tk() # 创建Canvas和Scrollbar来实现纵向滚动条 canvas = tk.Canvas(window) # 创建Canvas对象 canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) # 在窗口左侧填充并扩展 scrollbar = tk.Scrollbar(window, command=canvas.yview) # 创建Scrollbar对象并与Canvas对象的纵向滚动条绑定 scrollbar.pack(side=tk.RIGHT, fill=tk.Y) # 放置Scrollbar对象于窗口右侧并填充 canvas.configure(yscrollcommand=scrollbar.set) # 配置Canvas对象的纵向滚动条 canvas.bind('<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox("all"))) # 绑定Canvas对象配置的事件 frame = tk.Frame(canvas) # 创建Frame对象 canvas.create_window((0, 0), window=frame, anchor='nw') # 在Canvas对象上创建Frame对象,并设置初始坐标和锚点为左上角 # 显示category项和复选框 # 初始化一个空集合用于保存选中的节点 selected_nodes = set() def display_node(node, indent=0): # 如果节点是category则创建一个复选框并显示 if node.tag == 'category': # 创建一个Tkinter的整数变量 var = tk.IntVar() # 创建一个复选框并设置它的文本和变量,缩进可以反映节点层级 checkbox = tk.Checkbutton(frame, text=' ' * indent + node.get('name'), variable=var, anchor=tk.W) # 将复选框显示在画布的顶部并填充水平方向 checkbox.pack(side=tk.TOP, fill=tk.X) # 设置当复选框状态改变时的回调函数 def add_to_list(): # 如果被选中则添加节点到选定节点列表中 if var.get() == 1: selected_nodes.add(node) # 如果被取消选中则从选定节点列表中删除节点 else: selected_nodes.discard(node) # 配置复选框的回调函数 checkbox.config(command=add_to_list) # 递归显示子节点 for child in node: display_node(child, indent + 4) # 从根节点开始递归显示所有节点 display_node(root) # 配置画布的垂直滚动条的回调函数 scrollbar.config(command=canvas.yview) # 创建数组,用于排除特殊关键字(库最外围的框架) id_list = ['Arduino_WJ','ESP8266_WJ','ESP32_WJ'] # id_list = ['Arduino_WJ','Sensor_WJ','Actuator_WJ','Monitor_WJ','Communicate_WJ','Expand_WJ','Supplement_WJ','Match_WJ','ESP8266_WJ','ESP32_WJ'] # 添加确认按钮 def confirm_selection(): # 判断打开文件是否包含关键字,根据关键字生成选定节点的源代码 if "Arduino" in file_name: # 设置生成选定节点的源代码 content = '''<!-- type="company" block="block/Arduino_WJ.js" generator="generator/Arduino_WJ.js" sample="" lib="" -->\n <script type="text/javascript" src="../../../arduino/libraries/asr_ld3320/pinyin_dict_notone.js"></script><!-- 加载中文转拼音JS文件--> <script type="text/javascript" src="../../blocks/company/Arduino_WJ.js"></script> <script type="text/javascript" src="../../generators/arduino/company/Arduino_WJ.js"></script>\n <category id="Arduino_WJ" name="Arduino" colour="#4C689C">\n''' elif "ESP8266_WJ.xml" in file_name: # 设置生成选定节点的源代码 content = '''<!-- type="company" block="block/ESP8266_WJ.js" generator="generator/ESP8266_WJ.js" sample="ESP8266.ino" lib="WiFiManager-development" media="media/ESP8266_WJ" -->\n <script type="text/javascript" src="../../blocks/company/ESP8266_WJ.js"></script> <script type="text/javascript" src="../../generators/arduino/company/ESP8266_WJ.js"></script>\n <category id="ESP8266_WJ" name="ESP8266" colour="#3e8bea">\n''' elif "ESP32_WJ.xml" in file_name: # 设置生成选定节点的源代码 content = '''<!-- type="company" block="block/ESP32_WJ.js" generator="generator/ESP32_WJ.js" sample="ESP8266.ino" lib="WiFiManager-development" media="media/ESP32_WJ" -->\n <script type="text/javascript" src="../../blocks/company/ESP32_WJ.js"></script> <script type="text/javascript" src="../../generators/arduino/company/ESP32_WJ.js"></script>\n <category id="ESP32_WJ" name="ESP32" colour="#8bea3e">\n''' else: # 显示警告信息,仅支持特定文件 messagebox.showwarning("警告", "仅可用于 Arduino_WJ.xml/ESP8266_WJ.xml/ESP32_WJ.xml") print("仅可用于 Arduino_WJ.xml/ESP8266_WJ.xml/ESP32_WJ.xml") #结束程序 raise SystemExit # 阶段提示 print("选择另存至,覆盖原文件后生效(注意备份源文件)") # 弹窗选择另存为 save_path = filedialog.asksaveasfilename(defaultextension='.xml', filetypes=[('XML Files', '*.xml')]) # 如果用户选择了另存为的路径,则将生成的源代码写入到该路径下的XML文件中 if save_path: with open(save_path, 'w', encoding='utf-8') as f: # 将预先生成好的XML代码写入文件 f.write(content) # 循环遍历用户选择的节点列表 for node in selected_nodes: # 判断节点的ID是否在指定的ID列表中,如果是,则不输出该节点 if node.get('id') in id_list: # 什么操作都不做,pass跳过 pass else: # 将该节点的XML代码写入到文件中 f.write(ET.tostring(node, encoding='unicode') + '\n') # 为了位于一个库内,在文件头部已经加上 主<category>,结尾处补上 </category> 收尾 f.write('\n</category>') # 创建确认按钮并绑定确认函数 confirm_button = tk.Button(window, text='确认', command=confirm_selection) confirm_button.pack() # 进入Tkinter事件循环 window.mainloop() ```
造物者W
2023年4月18日 09:14
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码