自製讀取 H 檔案並找出 define 的程式
說是自製其實是吹牛的, 這個程式其實是用 ChatGPT 來做 Vibe coding , 先寫了一個Python程式,再把它包成windows exe執行檔 (pyinstaller --onefile --noconsole ParseDefine.py)
主程式如下
import re
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
def parse_defines(header_file):
define_pattern = re.compile(r'^\s*#define\s+(\w+)\s+(.+)$')
defines = {}
try:
with open(header_file, 'r', encoding='utf-8') as f:
for line in f:
match = define_pattern.match(line)
if match:
key, value = match.groups()
defines[key] = value.strip()
except Exception as e:
messagebox.showerror("錯誤", f"讀取 {header_file} 失敗: {e}")
return defines
def on_select(event=None):
key = combo.get()
if key in defines:
value_box.config(state="normal")
value_box.delete("1.0", tk.END)
value_box.insert(tk.END, defines[key])
value_box.config(state="disabled")
def on_search(event=None):
keyword = search_var.get().strip().lower()
if keyword:
filtered = [k for k in defines.keys() if keyword in k.lower()]
else:
filtered = list(defines.keys())
combo["values"] = filtered
if filtered:
combo.current(0)
on_select()
else:
value_box.config(state="normal")
value_box.delete("1.0", tk.END)
value_box.insert(tk.END, "(找不到符合的定義)")
value_box.config(state="disabled")
def open_file():
global defines
path = filedialog.askopenfilename(
title="選擇 Token.h",
filetypes=[("Header Files", "*.h"), ("All Files", "*.*")]
)
if path:
defines = parse_defines(path)
if defines:
combo["values"] = list(defines.keys())
combo.current(0)
on_select()
else:
value_box.config(state="normal")
value_box.delete("1.0", tk.END)
value_box.insert(tk.END, "(沒有找到任何 #define)")
value_box.config(state="disabled")
def show_context_menu(event):
context_menu.tk_popup(event.x_root, event.y_root)
def copy_selection():
try:
selected_text = value_box.selection_get()
root.clipboard_clear()
root.clipboard_append(selected_text)
except tk.TclError:
pass
def select_all():
value_box.tag_add("sel", "1.0", "end-1c")
def show_about():
messagebox.showinfo(
"關於",
"作者: No Body\n\n發布時間: 2025/09/19\n版權: BSD License"
)
if __name__ == "__main__":
defines = {}
# 主視窗
root = tk.Tk()
root.title("Token.h 定義檢視器")
root.geometry("700x500")
# 右上角「關於」按鈕
about_btn = tk.Button(root, text="關於", command=show_about)
about_btn.place(relx=1.0, x=-10, y=10, anchor="ne") # 右上角,距右邊10px
# 開檔按鈕
open_btn = tk.Button(root, text="載入 Token.h", command=open_file)
open_btn.pack(pady=5)
# 搜尋框
tk.Label(root, text="搜尋 Token 名稱:").pack(pady=5)
search_var = tk.StringVar()
search_entry = tk.Entry(root, textvariable=search_var, width=50)
search_entry.pack()
search_entry.bind("<Return>", on_search)
search_btn = tk.Button(root, text="搜尋", command=on_search)
search_btn.pack(pady=5)
# 下拉選單
tk.Label(root, text="選擇 Token 名稱:").pack(pady=5)
combo = ttk.Combobox(root, state="readonly", width=60)
combo.pack()
combo.bind("<<ComboboxSelected>>", on_select)
# 對應值顯示框
tk.Label(root, text="對應值:").pack(pady=5)
value_box = tk.Text(root, width=50, height=10, wrap="word", font=("Arial", 12))
value_box.pack(pady=10)
value_box.config(state="disabled")
# 右鍵選單
context_menu = tk.Menu(root, tearoff=0)
context_menu.add_command(label="複製", command=copy_selection)
context_menu.add_command(label="全選", command=select_all)
value_box.bind("<Button-3>", show_context_menu)
root.mainloop()
留言