tk.mainloop() против root.mainloop()?

Я попытался найти некоторые Q/A или статью об использовании tk.mainloop() против root.mainloop() без успеха.

Мой вопрос заключается в следующем: есть ли разница между 2 использованиями. Мне кажется, что правильным методом было бы использовать tk_instance_variable_name.mainloop() против просто делать tk.mainloop() но из того, что я вижу, оба работают нормально. Есть ли причина, по которой нужно избегать tk.mainloop() или это просто предпочтение.

Если об этом уже спрашивали, предоставьте ссылку Q/A, поскольку я не могу найти ее. Я чувствую, что об этом уже спросили, но мне не повезло искать его.

Может кто-то может объяснить, почему tk.mainloop() будет работать здесь, когда я чувствую, что он не должен работать, поскольку он не используется в имени переменной экземпляра tk.

Пример использования root работать так, как ожидалось:

import tkinter as tk

root = tk.Tk()
tk.Label(root, text="Test").pack()
root.mainloop() # using the variable name root

Пример использования tk работает хорошо, насколько я могу сказать:

import tkinter as tk

root = tk.Tk()
tk.Label(root, text="Test").pack()
tk.mainloop() # using tk

2 ответа

Решение

Я попытался найти некоторые Q/A или статью об использовании tk.mainloop() против root.mainloop() безуспешно.

Мой вопрос заключается в следующем: есть ли разница между 2 использованиями.

Короткий ответ: нет разницы в нормальном случае использования.

У каждого виджета есть связанный интерпретатор tcl, который создается при создании корневого виджета, явно или неявно. Когда вы звоните mainloop из любого виджета, он будет запускать mainloop функция в интерпретаторе, связанная с корневым окном этого виджета.

Если вы позвоните mainloop метод, который является частью tkinter модуль (например: tk.mainloop() в вашем примере), он будет называть mainloop функция интерпретатора по умолчанию. По умолчанию интерпретатор является первым созданным интерпретатором. Таким образом, в обычном случае одного экземпляра Tk, tk.mainloop() а также root.mainloop() назовите точно такой же код.

Кстати, каждый виджет tkinter наследует этот метод, так что это тоже работает:

import tkinter as tk

lbl = tk.Label(text="Test")
lbl.pack()
lbl.mainloop()
Другие вопросы по тегам