Python tkinter 标签

Python tkinter Label

嗨,我有一个关于 tkinter 中的标签的小问题。

当你在 classes 之外使用 Label 时,你会做类似

的事情
import tkinter as tk


root = tk.Tk()
label = tk.Label(root, text = "something", background = "something")
label.pack()

但是,当它位于 class 中并且代码类似于

将 tkinter 导入为 tk

class Example(tk.Frame):

    COLOURS = [ "#f45", "#ee5", "#aa4", "#a1e433", "#e34412", "#116611",
                "#111 eeefff", "#3aa922191", "#abbabbaaa" ]

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.parent = parent


        col = 1
        for colour in Example.COLOURS:
        #
        label = tk.Label(self, text=colour, background=colour)
        #
        label.grid(row=1, column=col)
        col += 1


def main():
root = tk.Tk()
ex = Example(root)
root.geometry("+300+300")
root.mainloop()

if __name__ == '__main__':
    main()

但不应该更像

label = tk.Label(self.parent, text=colour, background=colour)

因为 self.parent 对应于 root? 当我尝试这样做时,出现错误,并且只有在我有 label.grid(...) 行在它下面(我试过 pack 并且工作正常)。

所以我想到了这段代码

import tkinter as tk

root = tk.Tk()

label = tk.Label(root)
label.grid(row=0, column=0)

root.mainloop()

也行不通,但实际上效果很好。 所以我很困惑。谁能解释一下?

不,不应该是self.parent

在您给出的 class 示例中, class 本身就是一个框架。以这种方式设计是为了使示例自包含。通过从 Frame 继承,您可以获取 class 中的所有代码并将其放在 GUI 中的任何位置。您可以将 class 及其中的所有内容视为一个自定义小部件。您可以拥有多个这样的 classes,并且每个都可以被视为一个 GUI 对象。

为了做到这一点,class 只将小部件放在其自身内部,而不是其父级中。

使用 Frame 的子类的全部目的是充当其他小部件的容器。如果您不打算将它用作其他小部件的容器,那么从 Frame.

继承是没有意义的

相当于这个,没有classes:

import tkinter as tk

root = tk.Tk()
frame = tk.Frame(root)
frame.pack(...)
label = tk.Label(frame, text = "something", background = "something")
label.pack(...)

如果您希望 class 将小部件放在父级中,您可以像下面这样定义 class。请注意,它继承自 object 而不是 Frame:

class Example(object):
    def __init__(self, parent):
        self.parent = parent
        ...
        label = tk.Label(parent, ...)