python - libreria - ¿Por qué se desalientan las instancias múltiples de Tk?
tkinter examples (2)
¿Por qué se considera malo tener múltiples instancias de
Tk
?
Tkinter es solo un contenedor de Python alrededor de un intérprete Tcl incorporado que importa la biblioteca Tk. Cuando crea una ventana raíz, crea una instancia de un intérprete Tcl.
Cada intérprete de Tcl es una caja de arena aislada.
Un objeto en un sandbox no puede interactuar con objetos en otro.
La manifestación más común de eso es que un
StringVar
creado en un intérprete no es visible en otro.
Lo mismo ocurre con los widgets: no puede crear widgets en un intérprete que tenga como widget principal en otro intérprete.
Desde un punto de vista técnico, no hay ninguna razón por la que no pueda tener dos instancias de
Tk
al mismo tiempo.
La recomendación en contra es porque rara vez existe la necesidad real de tener dos o más intérpretes de Tcl distintos, y causa problemas que son difíciles de entender para los principiantes.
¿El segundo fragmento se considera un poco mejor o sufre las mismas condiciones que el primer código?
Es imposible decir si el segundo ejemplo en la pregunta es mejor o no sin saber lo que está tratando de lograr. Probablemente no sea mejor ya que, nuevamente, rara vez hay un momento en el que realmente necesites dos instancias.
La mejor solución el 99.9% del tiempo es crear exactamente una instancia de
Tk
que use durante la vida de su programa.
En pocas palabras, así es como tkinter y el intérprete Tcl / Tk subyacente fueron diseñados para ser utilizados.
Considere el siguiente ejemplo:
import tkinter as tk
root = tk.Tk()
root.title("root")
other_window = tk.Tk()
other_window.title("other_window")
root.mainloop()
y también vea el siguiente ejemplo que crea instancias de
Tk
consecutivas en lugar de a la vez, por lo que hay
exactamente una
instancia de
Tk
en un momento dado:
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()
-
¿Por qué se considera malo tener múltiples instancias de
Tk
? - ¿El segundo fragmento se considera un poco mejor o sufre las mismas condiciones que el primer código?
La mejor referencia que he encontrado hasta ahora es esta sección en el tkinterbook .
En los ejemplos simples que hemos usado hasta aquí, solo hay una ventana en la pantalla; La ventana raíz. Esto se crea automáticamente cuando llama al constructor Tk
y
Si necesita crear ventanas adicionales, puede usar el widget Toplevel . Simplemente crea una nueva ventana en la pantalla, una ventana que se ve y se comporta más o menos como la ventana raíz original
Mi opinión sobre esto es que una instancia de
Tk
crea un widget
Toplevel
, además de cosas como
mainloop
, de las cuales solo debería haber uno.