mirror of
https://github.com/goldenfishs/MRobot.git
synced 2025-04-28 23:39:55 +08:00
提交一下代码
This commit is contained in:
parent
4c697b011f
commit
51e946c04e
352
MRobot.py
352
MRobot.py
@ -4,6 +4,8 @@ import threading
|
|||||||
import shutil
|
import shutil
|
||||||
import re
|
import re
|
||||||
from git import Repo
|
from git import Repo
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
|
||||||
# 配置常量
|
# 配置常量
|
||||||
REPO_DIR = "MRobot_repo"
|
REPO_DIR = "MRobot_repo"
|
||||||
@ -14,6 +16,7 @@ class MRobotApp:
|
|||||||
self.ioc_data = None
|
self.ioc_data = None
|
||||||
self.add_gitignore_var = None # 延迟初始化
|
self.add_gitignore_var = None # 延迟初始化
|
||||||
self.header_file_vars = {}
|
self.header_file_vars = {}
|
||||||
|
self.task_vars = [] # 用于存储任务的变量
|
||||||
|
|
||||||
# 克隆仓库
|
# 克隆仓库
|
||||||
def clone_repo(self):
|
def clone_repo(self):
|
||||||
@ -100,20 +103,29 @@ class MRobotApp:
|
|||||||
# 定义需要处理的文件夹
|
# 定义需要处理的文件夹
|
||||||
folders = ["bsp", "component", "device", "module"]
|
folders = ["bsp", "component", "device", "module"]
|
||||||
|
|
||||||
|
# 遍历每个文件夹,复制选中的 .h 和 .c 文件
|
||||||
for folder in folders:
|
for folder in folders:
|
||||||
folder_dir = os.path.join(REPO_DIR, "User", folder)
|
folder_dir = os.path.join(REPO_DIR, "User", folder)
|
||||||
for file_name, var in self.header_file_vars.items():
|
if not os.path.exists(folder_dir):
|
||||||
if var.get():
|
continue # 如果文件夹不存在,跳过
|
||||||
# 复制 .h 文件
|
|
||||||
h_file_src = os.path.join(folder_dir, f"{file_name}.h")
|
|
||||||
h_file_dest = os.path.join("User", folder, f"{file_name}.h")
|
|
||||||
self.copy_file_from_repo(h_file_src, h_file_dest)
|
|
||||||
|
|
||||||
# 复制同名 .c 文件(如果存在)
|
for file_name in os.listdir(folder_dir):
|
||||||
c_file_src = os.path.join(folder_dir, f"{file_name}.c")
|
file_base, file_ext = os.path.splitext(file_name)
|
||||||
c_file_dest = os.path.join("User", folder, f"{file_name}.c")
|
if file_ext not in [".h", ".c"]:
|
||||||
if os.path.exists(c_file_src):
|
continue # 只处理 .h 和 .c 文件
|
||||||
self.copy_file_from_repo(c_file_src, c_file_dest)
|
|
||||||
|
# 强制复制与文件夹同名的文件
|
||||||
|
if file_base == folder:
|
||||||
|
src_path = os.path.join(folder_dir, file_name)
|
||||||
|
dest_path = os.path.join("User", folder, file_name)
|
||||||
|
self.copy_file_from_repo(src_path, dest_path)
|
||||||
|
continue # 跳过后续检查,直接复制
|
||||||
|
|
||||||
|
# 检查是否选中了对应的文件
|
||||||
|
if file_base in self.header_file_vars and self.header_file_vars[file_base].get():
|
||||||
|
src_path = os.path.join(folder_dir, file_name)
|
||||||
|
dest_path = os.path.join("User", folder, file_name)
|
||||||
|
self.copy_file_from_repo(src_path, dest_path)
|
||||||
|
|
||||||
threading.Thread(target=task).start()
|
threading.Thread(target=task).start()
|
||||||
|
|
||||||
@ -158,42 +170,84 @@ class MRobotApp:
|
|||||||
# 显示主窗口
|
# 显示主窗口
|
||||||
def show_main_window(self):
|
def show_main_window(self):
|
||||||
root = tk.Tk()
|
root = tk.Tk()
|
||||||
root.title("MRobot自动生成脚本")
|
root.title("MRobot 自动生成脚本")
|
||||||
root.geometry("700x700") # 调整窗口大小
|
root.geometry("800x600") # 调整窗口大小以适应布局
|
||||||
|
|
||||||
# 初始化 BooleanVar
|
# 初始化 BooleanVar
|
||||||
self.add_gitignore_var = tk.BooleanVar(value=True)
|
self.add_gitignore_var = tk.BooleanVar(value=True)
|
||||||
|
|
||||||
|
# 创建主框架
|
||||||
|
main_frame = tk.Frame(root)
|
||||||
|
main_frame.pack(fill="both", expand=True)
|
||||||
|
|
||||||
# 添加标题
|
# 添加标题
|
||||||
title_label = tk.Label(root, text="MRobot 自动生成脚本", font=("Arial", 16, "bold"))
|
title_label = tk.Label(main_frame, text="MRobot 自动生成脚本", font=("Arial", 16, "bold"))
|
||||||
title_label.pack(pady=10)
|
title_label.pack(pady=10)
|
||||||
|
|
||||||
# 添加复选框
|
|
||||||
gitignore_frame = tk.Frame(root)
|
|
||||||
gitignore_frame.pack(pady=10)
|
|
||||||
tk.Checkbutton(gitignore_frame, text="添加 .gitignore", variable=self.add_gitignore_var).pack(anchor="w")
|
|
||||||
|
|
||||||
# 添加 FreeRTOS 状态标签
|
# 添加 FreeRTOS 状态标签
|
||||||
freertos_status_label = tk.Label(root, text="FreeRTOS 状态: 检测中...", font=("Arial", 12))
|
freertos_status_label = tk.Label(main_frame, text="FreeRTOS 状态: 检测中...", font=("Arial", 12))
|
||||||
freertos_status_label.pack(pady=10)
|
freertos_status_label.pack(pady=10)
|
||||||
self.update_freertos_status(freertos_status_label)
|
self.update_freertos_status(freertos_status_label)
|
||||||
|
|
||||||
# 显示 .h 文件复选框
|
# 模块文件选择和任务管理框架
|
||||||
header_files_frame = tk.LabelFrame(root, text="模块文件选择", padx=10, pady=10, font=("Arial", 10, "bold"))
|
module_task_frame = tk.Frame(main_frame)
|
||||||
header_files_frame.pack(pady=10, fill="both", expand=True)
|
module_task_frame.pack(fill="both", expand=True, padx=10, pady=10)
|
||||||
|
|
||||||
|
# 模块文件选择框
|
||||||
|
header_files_frame = tk.LabelFrame(module_task_frame, text="模块文件选择", padx=10, pady=10, font=("Arial", 10, "bold"))
|
||||||
|
header_files_frame.pack(side="left", fill="both", expand=True, padx=5)
|
||||||
self.header_files_frame = header_files_frame
|
self.header_files_frame = header_files_frame
|
||||||
self.update_header_files()
|
self.update_header_files()
|
||||||
|
|
||||||
# 添加生成按钮
|
# 任务管理框
|
||||||
button_frame = tk.Frame(root)
|
task_frame = tk.LabelFrame(module_task_frame, text="任务管理", padx=10, pady=10, font=("Arial", 10, "bold"))
|
||||||
button_frame.pack(pady=20)
|
task_frame.pack(side="left", fill="both", expand=True, padx=5)
|
||||||
|
self.task_frame = task_frame
|
||||||
|
self.update_task_ui()
|
||||||
|
|
||||||
|
# 生成按钮和 .gitignore 选项
|
||||||
|
button_frame = tk.Frame(main_frame)
|
||||||
|
button_frame.pack(fill="x", pady=10)
|
||||||
generate_button = tk.Button(button_frame, text="一键自动生成MR架构", command=self.generate_action, bg="green", fg="white", font=("Arial", 12, "bold"))
|
generate_button = tk.Button(button_frame, text="一键自动生成MR架构", command=self.generate_action, bg="green", fg="white", font=("Arial", 12, "bold"))
|
||||||
generate_button.pack()
|
generate_button.pack(side="left", padx=10)
|
||||||
|
tk.Checkbutton(button_frame, text="添加 .gitignore", variable=self.add_gitignore_var).pack(side="left", padx=10)
|
||||||
|
|
||||||
# 在程序关闭时清理
|
# 在程序关闭时清理
|
||||||
root.protocol("WM_DELETE_WINDOW", lambda: self.on_closing(root))
|
root.protocol("WM_DELETE_WINDOW", lambda: self.on_closing(root))
|
||||||
root.mainloop()
|
root.mainloop()
|
||||||
|
|
||||||
|
# 更新任务管理 UI
|
||||||
|
def update_task_ui(self):
|
||||||
|
for widget in self.task_frame.winfo_children():
|
||||||
|
widget.destroy()
|
||||||
|
|
||||||
|
# 设置任务管理框的固定宽度
|
||||||
|
self.task_frame.config(width=300) # 将宽度固定为 300 像素
|
||||||
|
|
||||||
|
# 显示任务列表
|
||||||
|
for i, task_var in enumerate(self.task_vars):
|
||||||
|
task_row = tk.Frame(self.task_frame, width=300) # 设置任务行的宽度
|
||||||
|
task_row.pack(fill="x", pady=5)
|
||||||
|
|
||||||
|
# 调整输入框和按钮的宽度
|
||||||
|
tk.Entry(task_row, textvariable=task_var, width=25).pack(side="left", padx=5) # 输入框宽度
|
||||||
|
tk.Button(task_row, text="删除", command=lambda idx=i: self.remove_task(idx), bg="red", fg="white").pack(side="left", padx=5)
|
||||||
|
|
||||||
|
# 添加新任务按钮
|
||||||
|
add_task_button = tk.Button(self.task_frame, text="添加任务", command=self.add_task, bg="blue", fg="white")
|
||||||
|
add_task_button.pack(pady=10)
|
||||||
|
|
||||||
|
# 添加任务
|
||||||
|
def add_task(self):
|
||||||
|
new_task_var = tk.StringVar(value=f"Task_{len(self.task_vars) + 1}")
|
||||||
|
self.task_vars.append(new_task_var)
|
||||||
|
self.update_task_ui()
|
||||||
|
|
||||||
|
# 删除任务
|
||||||
|
def remove_task(self, idx):
|
||||||
|
del self.task_vars[idx]
|
||||||
|
self.update_task_ui()
|
||||||
|
|
||||||
# 更新文件夹显示
|
# 更新文件夹显示
|
||||||
def update_folder_display(self):
|
def update_folder_display(self):
|
||||||
for widget in self.folder_frame.winfo_children():
|
for widget in self.folder_frame.winfo_children():
|
||||||
@ -223,22 +277,205 @@ class MRobotApp:
|
|||||||
module_frame = tk.LabelFrame(self.header_files_frame, text=folder.capitalize(), padx=10, pady=10, font=("Arial", 10, "bold"))
|
module_frame = tk.LabelFrame(self.header_files_frame, text=folder.capitalize(), padx=10, pady=10, font=("Arial", 10, "bold"))
|
||||||
module_frame.pack(fill="x", pady=5)
|
module_frame.pack(fill="x", pady=5)
|
||||||
|
|
||||||
# 创建一个横向布局的容器
|
# 使用 grid 布局管理器实现自动换行
|
||||||
row_frame = tk.Frame(module_frame)
|
row, col = 0, 0
|
||||||
row_frame.pack(fill="x", pady=5)
|
|
||||||
|
|
||||||
for file in os.listdir(folder_dir):
|
for file in os.listdir(folder_dir):
|
||||||
if file.endswith(".h"):
|
file_base, file_ext = os.path.splitext(file)
|
||||||
file_name_without_extension = os.path.splitext(file)[0] # 去掉 .h 后缀
|
if file_ext == ".h" and file_base != folder: # 过滤掉与文件夹同名的文件
|
||||||
var = tk.BooleanVar(value=False)
|
var = tk.BooleanVar(value=False)
|
||||||
self.header_file_vars[file_name_without_extension] = var
|
self.header_file_vars[file_base] = var
|
||||||
# 显示复选框,横向排列
|
|
||||||
tk.Checkbutton(
|
# 创建复选框并添加到 grid 中
|
||||||
row_frame,
|
checkbox = tk.Checkbutton(
|
||||||
text=file_name_without_extension,
|
module_frame,
|
||||||
variable=var
|
text=file_base,
|
||||||
).pack(side="left", padx=5, pady=5)
|
variable=var,
|
||||||
# 生成操作
|
wraplength=150 # 设置文本换行宽度
|
||||||
|
)
|
||||||
|
checkbox.grid(row=row, column=col, padx=5, pady=5, sticky="w")
|
||||||
|
# 控制列数,达到一定数量后换行
|
||||||
|
col += 1
|
||||||
|
if col >= 6: # 每行最多显示 3 个复选框
|
||||||
|
col = 0
|
||||||
|
row += 1
|
||||||
|
|
||||||
|
# 在 MRobotApp 类中添加以下方法
|
||||||
|
def generate_task_files(self):
|
||||||
|
try:
|
||||||
|
template_file_path = os.path.join(REPO_DIR, "User", "task", "task.c.template")
|
||||||
|
task_dir = os.path.join("User", "task")
|
||||||
|
|
||||||
|
# 检查模板文件是否存在
|
||||||
|
if not os.path.exists(template_file_path):
|
||||||
|
print(f"模板文件 {template_file_path} 不存在,无法生成 task.c 文件!")
|
||||||
|
return
|
||||||
|
|
||||||
|
# 创建目标目录(如果不存在)
|
||||||
|
os.makedirs(task_dir, exist_ok=True)
|
||||||
|
|
||||||
|
# 读取模板内容
|
||||||
|
with open(template_file_path, "r", encoding="utf-8") as f:
|
||||||
|
template_content = f.read()
|
||||||
|
|
||||||
|
# 为每个任务生成对应的 task.c 文件
|
||||||
|
for task_var in self.task_vars:
|
||||||
|
task_name = task_var.get()
|
||||||
|
task_file_path = os.path.join(task_dir, f"{task_name.lower()}.c")
|
||||||
|
|
||||||
|
# 替换模板中的占位符
|
||||||
|
task_content = template_content.replace("{{task_name}}", task_name)
|
||||||
|
task_content = task_content.replace("{{task_function}}", task_name)
|
||||||
|
task_content = task_content.replace("{{task_frequency}}", f"TASK_FREQ_{task_name.upper()}")
|
||||||
|
task_content = task_content.replace("{{task_delay}}", f"TASK_INIT_DELAY_{task_name.upper()}")
|
||||||
|
task_content = task_content.replace("{{task_variable}}", task_name)
|
||||||
|
|
||||||
|
# 写入生成的内容到文件
|
||||||
|
with open(task_file_path, "w", encoding="utf-8") as f:
|
||||||
|
f.write(task_content)
|
||||||
|
|
||||||
|
print(f"已成功生成 {task_file_path} 文件!")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"生成 task.c 文件时出错: {e}")
|
||||||
|
|
||||||
|
# 修改 user_task.c 文件
|
||||||
|
def modify_user_task_file(self):
|
||||||
|
try:
|
||||||
|
template_file_path = os.path.join(REPO_DIR, "User", "task", "user_task.c.template")
|
||||||
|
generated_task_file_path = os.path.join("User", "task", "user_task.c")
|
||||||
|
|
||||||
|
if not os.path.exists(template_file_path):
|
||||||
|
print(f"模板文件 {template_file_path} 不存在,无法生成 user_task.c 文件!")
|
||||||
|
return
|
||||||
|
|
||||||
|
os.makedirs(os.path.dirname(generated_task_file_path), exist_ok=True)
|
||||||
|
|
||||||
|
with open(template_file_path, "r", encoding="utf-8") as f:
|
||||||
|
template_content = f.read()
|
||||||
|
|
||||||
|
# 打印模板内容
|
||||||
|
# print(f"模板内容: {template_content}")
|
||||||
|
|
||||||
|
# 生成任务属性定义
|
||||||
|
task_attr_definitions = "\n".join([
|
||||||
|
f"""const osThreadAttr_t attr_{task_var.get().lower()} = {{
|
||||||
|
.name = "{task_var.get()}",
|
||||||
|
.priority = osPriorityNormal,
|
||||||
|
.stack_size = 128 * 4,
|
||||||
|
}};"""
|
||||||
|
for task_var in self.task_vars
|
||||||
|
])
|
||||||
|
|
||||||
|
# 打印生成的任务属性定义
|
||||||
|
# print(f"生成的任务属性定义: {task_attr_definitions}")
|
||||||
|
|
||||||
|
# 替换模板中的占位符
|
||||||
|
task_content = template_content.replace("{{task_attr_definitions}}", task_attr_definitions)
|
||||||
|
|
||||||
|
with open(generated_task_file_path, "w", encoding="utf-8") as f:
|
||||||
|
f.write(task_content)
|
||||||
|
|
||||||
|
print(f"已成功生成 {generated_task_file_path} 文件!")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"修改 user_task.c 文件时出错: {e}")
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
|
# 生成 user_task.h 文件
|
||||||
|
def generate_user_task_header(self):
|
||||||
|
try:
|
||||||
|
template_file_path = os.path.join(REPO_DIR, "User", "task", "user_task.h.template")
|
||||||
|
header_file_path = os.path.join("User", "task", "user_task.h")
|
||||||
|
|
||||||
|
if not os.path.exists(template_file_path):
|
||||||
|
print(f"模板文件 {template_file_path} 不存在,无法生成 user_task.h 文件!")
|
||||||
|
return
|
||||||
|
|
||||||
|
os.makedirs(os.path.dirname(header_file_path), exist_ok=True)
|
||||||
|
|
||||||
|
with open(template_file_path, "r", encoding="utf-8") as f:
|
||||||
|
template_content = f.read()
|
||||||
|
|
||||||
|
# 打印模板内容
|
||||||
|
# print(f"模板内容: {template_content}")
|
||||||
|
|
||||||
|
# 定义占位符内容
|
||||||
|
thread_definitions = "\n".join([f" osThreadId_t {task_var.get()};" for task_var in self.task_vars])
|
||||||
|
heap_water_mark_definitions = "\n".join([f" uint32_t {task_var.get()};" for task_var in self.task_vars])
|
||||||
|
freq_definitions = "\n".join([f" float {task_var.get()};" for task_var in self.task_vars])
|
||||||
|
last_up_time_definitions = "\n".join([f" uint32_t {task_var.get()};" for task_var in self.task_vars])
|
||||||
|
task_handle_definitions = "\n".join([f" osThreadId_t {task_var.get()};" for task_var in self.task_vars])
|
||||||
|
task_attr_declarations = "\n".join([f"extern const osThreadAttr_t attr_{task_var.get().lower()};" for task_var in self.task_vars])
|
||||||
|
task_function_declarations = "\n".join([f"void {task_var.get()}(void *argument);" for task_var in self.task_vars])
|
||||||
|
task_frequency_definitions = "\n".join([f"#define TASK_FREQ_{task_var.get().upper()} (100u)" for task_var in self.task_vars])
|
||||||
|
task_init_delay_definitions = "\n".join([f"#define TASK_INIT_DELAY_{task_var.get().upper()} (100u)" for task_var in self.task_vars])
|
||||||
|
|
||||||
|
# 打印生成的占位符内容
|
||||||
|
# print(f"thread_definitions: {thread_definitions}")
|
||||||
|
# print(f"heap_water_mark_definitions: {heap_water_mark_definitions}")
|
||||||
|
# print(f"freq_definitions: {freq_definitions}")
|
||||||
|
# print(f"last_up_time_definitions: {last_up_time_definitions}")
|
||||||
|
# print(f"task_handle_definitions: {task_handle_definitions}")
|
||||||
|
# print(f"task_attr_declarations: {task_attr_declarations}")
|
||||||
|
# print(f"task_function_declarations: {task_function_declarations}")
|
||||||
|
# print(f"task_frequency_definitions: {task_frequency_definitions}")
|
||||||
|
# print(f"task_init_delay_definitions: {task_init_delay_definitions}")
|
||||||
|
|
||||||
|
# 替换模板中的占位符
|
||||||
|
header_content = template_content.replace("{{thread_definitions}}", thread_definitions)
|
||||||
|
header_content = header_content.replace("{{heap_water_mark_definitions}}", heap_water_mark_definitions)
|
||||||
|
header_content = header_content.replace("{{freq_definitions}}", freq_definitions)
|
||||||
|
header_content = header_content.replace("{{last_up_time_definitions}}", last_up_time_definitions)
|
||||||
|
header_content = header_content.replace("{{task_handle_definitions}}", task_handle_definitions)
|
||||||
|
header_content = header_content.replace("{{task_attr_declarations}}", task_attr_declarations)
|
||||||
|
header_content = header_content.replace("{{task_function_declarations}}", task_function_declarations)
|
||||||
|
header_content = header_content.replace("{{task_frequency_definitions}}", task_frequency_definitions)
|
||||||
|
header_content = header_content.replace("{{task_init_delay_definitions}}", task_init_delay_definitions)
|
||||||
|
|
||||||
|
with open(header_file_path, "w", encoding="utf-8") as f:
|
||||||
|
f.write(header_content)
|
||||||
|
|
||||||
|
print(f"已成功生成 {header_file_path} 文件!")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"生成 user_task.h 文件时出错: {e}")
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
|
def generate_init_file(self):
|
||||||
|
try:
|
||||||
|
# 定义模板文件路径和生成文件路径
|
||||||
|
template_file_path = os.path.join(REPO_DIR, "User", "task", "init.c.template")
|
||||||
|
generated_file_path = os.path.join("User", "task", "init.c")
|
||||||
|
|
||||||
|
# 检查模板文件是否存在
|
||||||
|
if not os.path.exists(template_file_path):
|
||||||
|
print(f"模板文件 {template_file_path} 不存在,无法生成 init.c 文件!")
|
||||||
|
return
|
||||||
|
|
||||||
|
# 创建目标目录(如果不存在)
|
||||||
|
os.makedirs(os.path.dirname(generated_file_path), exist_ok=True)
|
||||||
|
|
||||||
|
# 读取模板内容
|
||||||
|
with open(template_file_path, "r", encoding="utf-8") as f:
|
||||||
|
template_content = f.read()
|
||||||
|
|
||||||
|
# 生成任务创建代码
|
||||||
|
thread_creation_code = "\n".join([
|
||||||
|
f" task_runtime.thread.{task_var.get().lower()} = osThreadNew({task_var.get()}, NULL, &attr_{task_var.get().lower()});"
|
||||||
|
for task_var in self.task_vars
|
||||||
|
])
|
||||||
|
|
||||||
|
# 替换模板中的占位符
|
||||||
|
init_content = template_content.replace("{{thread_creation_code}}", thread_creation_code)
|
||||||
|
|
||||||
|
# 写入生成的内容到文件
|
||||||
|
with open(generated_file_path, "w", encoding="utf-8") as f:
|
||||||
|
f.write(init_content)
|
||||||
|
|
||||||
|
print(f"已成功生成 {generated_file_path} 文件!")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"生成 init.c 文件时出错: {e}")
|
||||||
|
|
||||||
|
# 修改 generate_action 方法
|
||||||
def generate_action(self):
|
def generate_action(self):
|
||||||
def task():
|
def task():
|
||||||
# 检查并创建目录
|
# 检查并创建目录
|
||||||
@ -263,13 +500,34 @@ class MRobotApp:
|
|||||||
if file_ext not in [".h", ".c"]:
|
if file_ext not in [".h", ".c"]:
|
||||||
continue # 只处理 .h 和 .c 文件
|
continue # 只处理 .h 和 .c 文件
|
||||||
|
|
||||||
|
# 强制复制与文件夹同名的文件
|
||||||
|
if file_base == folder:
|
||||||
|
src_path = os.path.join(folder_dir, file_name)
|
||||||
|
dest_path = os.path.join("User", folder, file_name)
|
||||||
|
self.copy_file_from_repo(src_path, dest_path)
|
||||||
|
print(f"强制复制与文件夹同名的文件: {file_name}")
|
||||||
|
continue # 跳过后续检查,直接复制
|
||||||
|
|
||||||
# 检查是否选中了对应的文件
|
# 检查是否选中了对应的文件
|
||||||
if file_base in self.header_file_vars and self.header_file_vars[file_base].get():
|
if file_base in self.header_file_vars and self.header_file_vars[file_base].get():
|
||||||
src_path = os.path.join(folder_dir, file_name)
|
src_path = os.path.join(folder_dir, file_name)
|
||||||
dest_path = os.path.join("User", folder, file_name)
|
dest_path = os.path.join("User", folder, file_name)
|
||||||
self.copy_file_from_repo(src_path, dest_path)
|
self.copy_file_from_repo(src_path, dest_path)
|
||||||
|
|
||||||
|
# 修改 user_task.c 文件
|
||||||
|
self.modify_user_task_file()
|
||||||
|
|
||||||
|
# 生成 user_task.h 文件
|
||||||
|
self.generate_user_task_header()
|
||||||
|
|
||||||
|
# 生成 init.c 文件
|
||||||
|
self.generate_init_file()
|
||||||
|
|
||||||
|
# 生成 task.c 文件
|
||||||
|
self.generate_task_files()
|
||||||
|
|
||||||
threading.Thread(target=task).start()
|
threading.Thread(target=task).start()
|
||||||
|
|
||||||
# 程序关闭时清理
|
# 程序关闭时清理
|
||||||
def on_closing(self, root):
|
def on_closing(self, root):
|
||||||
self.delete_repo()
|
self.delete_repo()
|
||||||
|
Loading…
Reference in New Issue
Block a user