Python + Tkinter : "AttributeError"

标签 python tkinter mainloop

我也没有太多的 Python 实践,并且有一个理解错误的基本问题:AttributeError: 'NoneType' object has no attribute '_root',它只出现在我定义时dec 变量 BEFORE 定义主窗口 win:

import tkinter as tk
from tkinter import ttk
from tkinter import *

# This variable must be defined AFTER definition of the Tk() window!
dec = tk.BooleanVar()

# Main window
win = Tk()

# # This variable must be defined AFTER definition of the Tk() window!
# dec = tk.BooleanVar()


decreaseButton = Checkbutton(win, text = "Decrease (optional)", variable = dec)
decreaseButton.grid(row=1, column=1, sticky='W')


# Runs the event loop of Tkinter
win.mainloop()

为什么我必须定义窗口,然后定义 bool 变量?我对 Tkinter 有什么不理解的?

感谢大家的大力帮助,并致以最良好的祝愿 拉斯

最佳答案

您实际上可以在 tkinter 的 __init__.py 中查看它。

StringVarIntVarDoubleVarBooleanVar 都继承自类Variable:

class Variable:
    ...
    _default = ""
    _tk = None
    _tclCommands = None
    def __init__(self, master=None, value=None, name=None):
        ...
        if name is not None and not isinstance(name, str):
            raise TypeError("name must be a string")
        global _varnum
        if not master:
            master = _default_root
        self._root = master._root()
        self._tk = master.tk

    ...

所以你看到当创建一个 tkinter 变量时,它会查找存储为全局变量 _default_rootmaster(即 None如果您尚未创建 tk 实例),这就是您收到 AttributeError 的原因。

但您可能会问,为什么这不适用于小部件?这是因为 Widgets 继承自一个名为 BaseWidgets 的不同基类:

class BaseWidget(Misc):
    ...
    def _setup(self, master, cnf):
        ...
        if _support_default_root:
            global _default_root
            if not master:
                if not _default_root:
                    _default_root = Tk() <--- create a new instance of `Tk`
                master = _default_root

所以你看到当你创建一个没有master的新小部件时,BaseWidget实际上会创建一个新的tk实例作为_default_root变量。我的猜测是没有理由只为变量创建 Tk 的实例,因为不需要在屏幕上呈现任何内容,但同样不能应用于小部件。

因此,即使您没有自己创建 Tk 实例,以下内容也不会引发错误:

import tkinter as tk

a = tk.Button(text="ABC")

b = tk.BooleanVar()

关于Python + Tkinter : "AttributeError",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67353112/

相关文章:

c - Glib 线程与 GMain 循环事件

python - tk.mainloop() vs root.mainloop()?

python - Jinja2 相当于 python 多行字符串

python - 为什么要对 django 1.7+ 使用 __unicode__(self) 方法?

Python-如何解决 ssl.SSLError : [SSL: CA_MD_TOO_WEAK]

python - 如何设置在 Tkinter Entry 小部件中查看文本结尾?

python - 制作一个在程序运行时调用的函数

python-3.x - 将Tkinter转换为exe

python - Tkinter 标签未显示在弹出窗口中

python - Mainloop 似乎只在 tkinter 中运行一次