Почему несколько экземпляров Tk обескуражены?

Рассмотрим ниже пример:

import tkinter as tk root = tk.Tk() root.title("root") other_window = tk.Tk() other_window.title("other_window") root.mainloop() 

а также см. ниже пример, который создает экземпляры Tk back-to-back, а не сразу, поэтому в любой момент времени есть только один экземпляр Tk :

 import tkinter as tk def create_window(window_to_be_closed=None): if window_to_be_closed: window_to_be_closed.destroy() window = tk.Tk() tk.Button(window, text="Quit", command=lambda arg=window : create_window(arg)).pack() window.mainloop() create_window() 
  • Почему считается ошибочным иметь несколько экземпляров Tk ?
  • Является ли второй fragment лучше, или он страдает от тех же условий, что и первый код?

Почему считается ошибочным иметь несколько экземпляров Tk ?

Tkinter – это всего лишь shell python во встроенном интерпретаторе Tcl, который импортирует библиотеку Tk. Когда вы создаете корневое окно, вы создаете экземпляр интерпретатора Tcl.

Каждый интерпретатор Tcl представляет собой изолированную песочницу. Объект в одной песочнице не может взаимодействовать с объектами в другом. Наиболее распространенным проявлением является то, что StringVar созданный в одном интерпретаторе, не отображается в другом. То же самое касается виджетах – вы не можете создавать виджеты в одном интерпретаторе, который имеет родительский виджет в другом интерпретаторе.

С технической точки зрения нет причин, по которым вы не можете одновременно иметь два экземпляра Tk . Рекомендация против этого заключается в том, что редко существует необходимость иметь двух или более различных интерпретаторов Tcl, и это создает проблемы, которые трудно понять начинающим.

Является ли второй fragment лучше, или он страдает от тех же условий, что и первый код?

Невозможно сказать, лучше ли второй пример в вопросе или нет, не зная, чего вы пытаетесь достичь. Это, вероятно, не лучше, поскольку, опять же, редко бывает когда-то, когда вам действительно нужны два экземпляра.

Лучшее решение в 99,9% случаев – создать ровно один экземпляр Tk который вы используете для жизни своей программы. Проще говоря, именно так был разработан tkinter и базовый интерпретатор Tcl / Tk.

Лучшая ссылка, которую я нашел до сих пор, – это раздел в tkinterbook .

В простых примерах мы использовали это далеко, на экране есть только одно окно; корневое окно. Это автоматически создается при вызове конструктора Tk

а также

Если вам нужно создать дополнительные windows, вы можете использовать виджет Toplevel . Он просто создает новое окно на экране, окно, которое выглядит и ведет себя так же, как исходное корневое окно

Я Toplevel , что экземпляр Tk создает виджет Toplevel , плюс такие вещи, как mainloop , из которых должен быть только один.

  • Почему изображение Tkinter не отображается, если оно создано в функции?
  • Как я могу предотвратить изменение размера windows с помощью tkinter?
  • Давайте будем гением компьютера.