1
from tkinter import *
    
window = Tk()
    
sample = Label(text="some text")
sample.pack()
    
sample2 = Label(text="some other text")
sample2.pack()
    
sample.mainloop()

sample.mainloop()和有什么区别window.mainloop()sample(window, text ="some text")为什么程序在没有它的情况下运行时应该包含窗口。

4

1 回答 1

4

sample.mainloopwindow.mainloop在内部调用相同的函数,因此它们是相同的。在更新 GUI 时,它们都进入了一个while True循环。它们只能在.quit或被window.destroy调用时退出循环。

这是第tkinter/__init__.py1281 行的代码:

class Misc:
    ...
    def mainloop(self, n=0):
        """Call the mainloop of Tk."""
        self.tk.mainloop(n)

两者都Label继承Tk自,Misc因此它们都使用相同的方法。由此:

>>> root = Tk()
>>> root.tk
<_tkinter.tkapp object at 0x00000194116B0A30>
>>> label = Label(root, text="Random text")
>>> label.pack()
>>> label.tk
<_tkinter.tkapp object at 0x00000194116B0A30>

您可以看到这两个tk对象是同一个对象。

对于这一行:sample = Label(text="some text"),是否将window其作为第一个参数并不重要。仅当您有多个窗口时才重要,因为 tkinter 不知道您想要哪个窗口。

当您有 1 个窗口时,tkinter 使用该窗口。这是来自 tkinter/ init .py 第 2251 行的代码:

class BaseWidget(Misc):
    def __init__(self, master, widgetName, cnf={}, kw={}, extra=()):
        ...
        BaseWidget._setup(self, master, cnf)

    def _setup(self, master, cnf):
        ...
            if not master: # if master isn't specified
                ...
                master = _default_root # Use the default window
        self.master = master

tkinterLabel继承自Widgetwhich 继承自BaseWidget.

于 2021-02-13T12:36:07.603 回答