Python ttk对象-不理解特定于小部件的选项



我昨天正在实现一个ttk进度条,看到一些我不太理解的代码。

进度条的最大值可以使用如下命令设置:

progress_bar["maximum"] = max

我期望ttk Progressbar对象将使用实例变量来跟踪创建对象的最大值,但该语法看起来更像:

progres_bar.maximum = max

我的问题是,括号里的语法到底是怎么回事,术语是什么,我在哪里可以读到更多的信息?当我查看Progressbar类时,我看到的只有

class Progressbar(Widget):
    """Ttk Progressbar widget shows the status of a long-running
    operation. They can operate in two modes: determinate mode shows the
    amount completed relative to the total amount of work to be done, and
    indeterminate mode provides an animated display to let the user know
    that something is happening."""
    def __init__(self, master=None, **kw):
        """Construct a Ttk Progressbar with parent master.
        STANDARD OPTIONS
            class, cursor, style, takefocus
        WIDGET-SPECIFIC OPTIONS
            orient, length, mode, maximum, value, variable, phase
        """
        Widget.__init__(self, master, "ttk::progressbar", kw)

我看到有一个"特定于小部件的选项",但我不明白progress_bar["maximum"] = max如何设置该值,或者它是如何存储的。

ttk模块是安装了tk包的tcl解释器的薄包装器。Tcl/tk没有python类的概念。

在tcl/tk中,设置属性的方法是使用函数调用。例如,要设置maximum属性,您可以这样做:

.progress_bar configure -maximum 100

ttk包装器非常相似:

progress_bar.configure(maximum=100)

由于一个只有最初的tkinter开发人员知道的原因,他们决定实现一个允许你使用括号符号的字典接口。也许他们觉得这更像蟒蛇?例如:

progress_bar["maximum"] = 100

几乎可以肯定,他们没有为对象(例如:progress_bar.maximum = 100)创建这些属性的原因是一些tcl/tk小部件属性会与python保留字或标准属性(例如,id)冲突。通过使用字典,他们避免了这种冲突。

Widget扩展Tkinter.Widget扩展BaseWidget扩展Misc,其中包含:

__getitem__ = cget
def __setitem__(self, key, value):
    self.configure({key: value})

你可以在Python的库文件夹中找到它;搜索Tkinter.py

这是实现dict接口的代码。没有使用__getattr__()__setattr__()的属性访问实现。

为什么Tk的家伙走这条路?这很难说。Python中的Tk集成相当老了。或者人们觉得__getattr__()和它的怪癖会引起更多的麻烦。

最新更新