拆分CustomTkinter GUI与主脚本时出现NameError问题求助
解决方案
你的问题根源有两个:循环导入(main和interface互相导入)和函数无法访问App实例(app不是全局变量,函数找不到它)。以下是具体修复方案:
方案一:通过回调传递实例(推荐)
重构代码,让main.py作为程序入口,避免循环导入,同时将App实例传递给业务函数。
修改后的 main.py
from interface import App def get_action_mco(app): # 接收App实例作为参数,直接访问其属性 print(app.optionmenu_type_chaine.get()) if __name__ == "__main__": # 作为入口创建App实例,将业务函数传入 app = App(get_action_mco) app.mainloop()
修改后的 interface.py
import customtkinter class App(customtkinter.CTk): def __init__(self, callback): super().__init__() self.geometry("300x150") # 窗口大小 # 下拉菜单 self.optionmenu_type_chaine = customtkinter.CTkOptionMenu( master=self, values=["", "Daily", "Weekly", "Monthly"], width=200, height=30 ) self.optionmenu_type_chaine.grid(row=2, column=1, padx=5, pady=5) # 按钮绑定回调,通过lambda传递当前App实例 self.button_recup_action = customtkinter.CTkButton( master=self, text="Cliquer ici", command=lambda: callback(self), width=200 ) self.button_recup_action.grid(row=6, column=1, pady=5, padx=5) # 修正变量名错误
关键修复点说明
- 消除循环导入:
interface.py不再导入main.py,而是通过构造函数接收业务函数,彻底解决循环依赖问题。 - 传递App实例:业务函数
get_action_mco新增app参数,通过lambda将当前App实例传入,函数就能直接访问实例的optionmenu_type_chaine属性。 - 修正变量名错误:原代码中
button_recup_action_mco是未定义的变量,改为和前面一致的button_recup_action。
方案二:将业务逻辑整合到App类中
如果业务逻辑和GUI耦合度较高,可以直接在App类内部定义方法,避免跨文件调用:
修改后的 interface.py
import customtkinter class App(customtkinter.CTk): def __init__(self): super().__init__() self.geometry("300x150") self.optionmenu_type_chaine = customtkinter.CTkOptionMenu( master=self, values=["", "Daily", "Weekly", "Monthly"], width=200, height=30 ) self.optionmenu_type_chaine.grid(row=2, column=1, padx=5, pady=5) self.button_recup_action = customtkinter.CTkButton( master=self, text="Cliquer ici", command=self.get_action_mco, # 绑定类内部方法 width=200 ) self.button_recup_action.grid(row=6, column=1, pady=5, padx=5) def get_action_mco(self): # 直接访问类内部属性 print(self.optionmenu_type_chaine.get())
main.py 简化为入口
from interface import App if __name__ == "__main__": app = App() app.mainloop()
这种方式更简洁,适合GUI和业务逻辑关联紧密的场景。
内容的提问来源于stack exchange,提问作者scn9658746
相关产品推荐
相关产品推荐

