global variable 奇怪的問題

從別的地方的呼叫 output_to_console 函數,裏面的 global console 竟然不是同一個,真是神奇了。

解決方法: python — 怎麼在兩個檔案之間分享全域變數

main.py

import tkinter as tk
import threading

# 初始化全域變數
console = None
console_initialized = threading.Event()  # 用於等待 console 初始化完成

def set_console(widget):
    global console
    console = widget
    console_initialized.set()  # 設置 console 已初始化完成

def output_to_console(text):
    global console
    print(f"output_to_console: id(console) = {id(console)}")  # 打印 console 的 id 來檢查是否相同
    if console is not None:
        console.insert(tk.END, text + "\n")
        console.see(tk.END)  # 自動滾動到最底部
    else:
        print("console 未初始化,無法輸出訊息")

def create_window():
    global console
    root = tk.Tk()
    root.title("Console Example")

    set_console(tk.Text(root, wrap=tk.WORD, width=50, height=20, bg="light yellow", bd=3, relief="solid"))
    console.pack(pady=10)

    print(f"create_window: id(console) = {id(console)}")  # 打印 console 的 id 來檢查是否相同

    # 初始化按鈕,但不設置命令
    test_button = tk.Button(root, text="呼叫外部函數", state=tk.DISABLED)
    test_button.pack(pady=10)

    def enable_button():
        from external_script import external_function
        test_button.config(command=external_function, state=tk.NORMAL)
        output_to_console("按鈕已啟用")

    # 等待 console 初始化完成後設置按鈕命令
    def check_initialization():
        if console_initialized.is_set():
            enable_button()
        else:
            root.after(100, check_initialization)  # 繼續檢查

    root.after(100, check_initialization)
    root.after(1000, lambda: output_to_console("這是一條測試訊息"))

    root.mainloop()

if __name__ == "__main__":
    # 在單獨的執行緒中啟動 GUI,確保主程式不被阻塞
    gui_thread = threading.Thread(target=create_window)
    gui_thread.start()

external_script.py

import main  # 匯入 main 模組

def external_function():
    print("external_function 被呼叫")
    print(f"external_function: id(main.console) = {id(main.console)}")  # 打印 console 的 id 來檢查是否相同

    # 確保 console 已初始化完成
    if main.console_initialized.is_set():
        if main.console is not None:
            print("console 已定義")
            main.output_to_console("這是一條來自 external_script.py 的測試訊息")
        else:
            print("console 未定義或未初始化,無法輸出訊息")
    else:
        print("console 尚未初始化")

出來的結果

set_console: id(console) = 1428650652208
create_window: id(console) = 1428650652208
output_to_console: id(console) = 1428650652208
output_to_console: id(console) = 1428650652208
external_function 被呼叫
external_function: id(console) = 140718425072112
console 尚未初始化

留言