Con Python, ¿cómo se llama a una GUI tkinter desde otra GUI?

Creé un par de GUIs usando tkinter. Pero ahora estoy interesado en combinarlos en una interfaz gráfica de usuario. Por lo tanto, la GUI de la persona que llama tendría botones que, al hacer clic, abrirían las otras GUI. Sin embargo, no puedo hacerlo funcionar. He hecho las importaciones correctamente (creo), edité las funciones principales en las subGUI y agregué el comando = GUI.main en mis botones. Obtengo que se cargue pero recibo errores sobre archivos faltantes … pero cuando ejecuto una GUI por sí misma funciona bien.

En mi investigación, leí que solo puede haber un mainloop en un progtwig Tkinter. Básicamente, no puedo usar una GUI de Tkinter para llamar a otra GUI de Tkinter. ¿Sabe lo que puedo hacer diferente, por ejemplo, puedo crear la GUI de la persona que llama usando wxPython y hacer que llame a todas las otras GUI que usan Tkinter?

¡Gracias!

Related of "Con Python, ¿cómo se llama a una GUI tkinter desde otra GUI?"

No puedes “llamar” a otra GUI. Si esta otra GUI crea su propia ventana raíz y llama a mainloop() , su única opción razonable es generar un nuevo proceso. Esa es una solución simple que requiere poco trabajo. Las dos GUIs serán completamente independientes entre sí.

Si tiene control sobre el código en ambas GUI y desea que trabajen juntos, puede hacer que la clase base de su GUI sea un marco en lugar de una ventana raíz, y luego puede crear tantas ventanas como desee con tantas GUIs como tu quieras

Por ejemplo, comencemos con una GUI simple. Copie lo siguiente y póngalo en un archivo llamado GUI1.py:

 import tkinter as tk class GUI(tk.Frame): def __init__(self, window): tk.Frame.__init__(self) label = tk.Label(self, text="Hello from %s" % __file__) label.pack(padx=20, pady=20) if __name__ == "__main__": root = tk.Tk() gui = GUI(root) gui.pack(fill="both", expand=True) tk.mainloop() 

Puede ejecutar esa GUI normalmente con algo como python GUI1.py

Ahora, haga una copia exacta de ese archivo y asígnele el nombre GUI2.py. También puedes ejecutarlo de la misma manera: python GUI2.py

Si desea crear un solo progtwig que tenga ambos, puede crear un tercer archivo que tenga este aspecto:

 import tkinter as tk import GUI1 import GUI2 # the first gui owns the root window win1 = tk.Tk() gui1 = GUI1.GUI(win1) gui1.pack(fill="both", expand=True) # the second GUI is in a Toplevel win2 = tk.Toplevel(win1) gui2 = GUI2.GUI(win2) gui2.pack(fill="both", expand=True) tk.mainloop() 

Dependiendo de su sistema operativo y administrador de ventanas, una ventana puede estar justo encima de la otra, por lo que puede necesitar moverla para ver ambas.

Gracias por las ideas. Al principio, su código no imprimirá el texto en la ventana de nivel superior. Así que lo edité un poco y funcionó! Gracias. GUI1 y GUI2 se ven como:

 import tkinter as tk def GUI1(Frame): label = tk.Label(Frame, text="Hello from %s" % __file__) label.pack(padx=20, pady=20) return if __name__ == "__main__": root = tk.Tk() GUI1(root) root.mainloop() 

Y luego la persona que llama se ve así:

 from tkinter import * import GUI1 import GUI2 def call_GUI1(): win1 = Toplevel(root) GUI1.GUI1(win1) return def call_GUI2(): win2 = Toplevel(root) GUI2.GUI2(win2) return # the first gui owns the root window if __name__ == "__main__": root = Tk() root.title('Caller GUI') root.minsize(720, 600) button_1 = Button(root, text='Call GUI1', width='20', height='20', command=call_GUI1) button_1.pack() button_2 = Button(root, text='Call GUI2', width='20', height='20', command=call_GUI2) button_2.pack() root.mainloop()