Python Tkinter类开发报错:'str'对象无'_root'属性
解决CustomTkinter中StringVar引发的AttributeError问题
错误原因
- 参数传递错误:
tkinter.StringVar("on")的写法不符合API规范,StringVar构造函数的第一个参数是master(父组件对象),你传入的字符串"on"被当作master处理,而字符串没有_root()方法,直接触发报错。 - 变量定义时机错误:
check_var定义在类的顶层(__init__方法外),此时CustomTkinter的主窗口实例还未创建,StringVar必须依附于已存在的Tk窗口实例才能正常初始化。
修复方案
- 将
check_var的定义移到__init__方法内部,作为实例属性,确保创建时已有主窗口实例。 - 正确初始化StringVar:通过
value参数设置初始值,master参数可选(默认绑定根窗口)。
修改后的完整代码
import customtkinter, tkinter import win32gui, win32con customtkinter.set_appearance_mode('system') customtkinter.set_default_color_theme('blue') class DebugPrompt(customtkinter.CTk): def __init__(self): super().__init__() self.title("3DT Menu") self.attributes('-transparentcolor', self['bg']) self.overrideredirect(1) self.focus_force() self.w = 500 self.h = 350 self.sw = self.winfo_screenwidth() self.sh = self.winfo_screenheight() self.x = (self.sw / 2) - (self.w / 2) self.y = (self.sh / 2) - (self.h / 2) self.geometry('%dx%d+%d+%d' % (self.w, self.h, self.x, self.y)) self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure((0, 1), weight=1) self.frame = customtkinter.CTkFrame(master=self) self.frame.grid(row=0, column=0, columnspan=1, padx=20, pady=(20, 20)) self.loadingLabel = customtkinter.CTkLabel(master=self.frame, text='Debug Menu', font=('Roboto', 24)) self.loadingLabel.grid(row=0, column=0, columnspan=1, padx=20, pady=(20, 20)) # 移到__init__内,正确初始化StringVar self.check_var = tkinter.StringVar(value="on") self.hideConsole = False # 使用实例属性self.check_var self.hideConCheckBX = customtkinter.CTkCheckBox(master=self.frame, text='Disable terminal on program start', variable=self.check_var, onvalue='on', offvalue='off') self.hideConCheckBX.grid(row=1, column=0, columnspan=1, padx=20, pady=(10, 0)) app = DebugPrompt() app.mainloop()
关键修改说明
- 将
check_var从类顶层移到__init__内部,命名为self.check_var,绑定到当前窗口实例。 - 初始化StringVar时,用
value="on"指定初始值,避免将值错误传递给master参数。 - 复选框的
variable参数改为self.check_var,正确引用实例属性。
内容的提问来源于stack exchange,提问作者Dynamic Games
相关产品推荐
相关产品推荐

