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, ...)
嗨,我有一个关于 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, ...)