自製讀取 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()



留言

這個網誌中的熱門文章

如何在VS2022 Community 簡要的設定UDK2018的環境

如何Build UDK2018