PAYATHON 2026

为什么调用 CTkLabel.place(self=None) 会触发 super() 类型错误?

数据小许

place() 是控件的实例方法,要在已创建的 CTkLabel 实例上调用。原代码显式传入了 self=None,因此报错。先创建标签,再调用它的 place() 即可。

正确写法

假设代码位于 App 的实例方法中,self 指向已经初始化的窗口,并且比较所需的变量已定义,可以这样写:

for i in range(5):
    if comparisonGuess[i] == word[i]:
        print(f"{guess[i]} is in the word at position {i+1}. hooray")

        label = ctk.CTkLabel(
            master=self,
            text=str(guess[i]),
            fg_color="green",
        )
        label.place(x=120 + (i * 30), y=guessCount * 25)

这段代码先用 ctk.CTkLabel(...) 创建标签,设置文字和颜色,再用 label.place(...) 设置标签的位置。

为什么 self=None 会导致 super() 报错?

调用实例方法时,Python 会自动把所属对象作为 self 传入:

label.place(x=120, y=25)

这里的 self 是 label,不需要手动填写。

原代码直接通过类访问 place(),并传入 self=None:

ctk.CTkLabel.place(self=None, ...)

这个调用没有创建标签,而是将 None 作为当前控件传入。根据异常堆栈,执行到 place() 内部的 super().place 时,由于当前对象是 NoneType,不符合 CTkBaseClass 对实例类型的要求,因此抛出了 TypeError。

为什么窗口里的 super().__init__() 没有解决问题?

在窗口类中调用:

class App(ctk.CTk):
    def __init__(self):
        super().__init__()

这初始化的是当前的 App 窗口。标签仍需通过 ctk.CTkLabel(...) 单独创建;窗口初始化也不会改变显式传给 place() 的 None。

self=App 同样不合适:App 是窗口类,而 place() 需要操作具体的标签实例。在这个例子中,应将窗口作为标签的 master 传入。

原代码还需要调整哪些参数?

  • text 应传给 CTkLabel(...),而不是 place(...)。place() 负责位置和布局,不负责设置标签文字。
  • text={guess[i]} 中的花括号会创建一个集合。要显示字符,可以使用 text=guess[i],或明确转换为 text=str(guess[i])。
  • 在 CustomTkinter 中,使用 fg_color="green" 将标签自身的填充背景设为绿色。bg_color 用于控件周围的背景区域,与标签自身的填充颜色含义不同。
  • 循环和条件分支需要正确缩进。range(5) 还要求被索引的对象至少包含五个元素。

如果代码位于普通函数中,没有指向窗口的 self,就将实际的窗口或容器实例作为参数传入,并使用 master=该实例 创建标签。

备注:内容仅供参考。