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 尚未初始化
留言
張貼留言