Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Bloquear ventana tras abrir otra(Tkinter).
#1
Buenos días:

Como dice el título del post, estoy intentando bloquear una ventana(Y todos sus widgets) tras abrir otra como sucede por ejemplo con messagebox.

Sé que con el método .transient sirve para que una ventana siempre esté "encima" de la otra pero a pesar de esto aún puedes pulsar un botón o introducir texto en un ENTRY por ejemplo lo cual no sucede con messagebox.

messagebox tiene un atributo que es el parent. Lo que hace parent es que la ventana de messagebox siempre permanece encima de la otra ventana y al mismo tiempo te impide el acceso a sus widget hasta que se cierra la ventana de messagebox.

La pregunta es cómo conseguir el mismo efecto que el parent de messagebox en una ventana propia.
¿Existe algún método para esto?.

Muchas Gracias.
Responder
#2
Hola.

Sí, tenés el método grab_set() para hacer que la nueva ventana no permita usar la ventana padre, por ejemplo:

Código:
import tkinter as tk
from tkinter import ttk


def abrir_ventana_secundaria():
    ventana_secundaria = tk.Toplevel()
    ventana_secundaria.title("Ventana secundaria")
    ventana_secundaria.config(width=300, height=200)
    boton_cerrar = ttk.Button(
        ventana_secundaria,
        text="Cerrar ventana",
        command=ventana_secundaria.destroy
    )
    boton_cerrar.place(x=75, y=75)
    ventana_secundaria.focus()
    ventana_secundaria.grab_set()


ventana_principal = tk.Tk()
ventana_principal.config(width=400, height=300)
ventana_principal.title("Ventana principal")
boton_abrir = ttk.Button(
    ventana_principal,
    text="Abrir ventana secundaria",
    command=abrir_ventana_secundaria
)
boton_abrir.place(x=100, y=100)
ventana_principal.mainloop()

Aquí la explicación: Ventanas secundarias en Tcl/Tk (tkinter).

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
(12-10-2022, 02:16 PM)Francisco escribió: Hola.

Sí, tenés el método grab_set() para hacer que la nueva ventana no permita usar la ventana padre, por ejemplo:

Código:
import tkinter as tk
from tkinter import ttk


def abrir_ventana_secundaria():
    ventana_secundaria = tk.Toplevel()
    ventana_secundaria.title("Ventana secundaria")
    ventana_secundaria.config(width=300, height=200)
    boton_cerrar = ttk.Button(
        ventana_secundaria,
        text="Cerrar ventana",
        command=ventana_secundaria.destroy
    )
    boton_cerrar.place(x=75, y=75)
    ventana_secundaria.focus()
    ventana_secundaria.grab_set()


ventana_principal = tk.Tk()
ventana_principal.config(width=400, height=300)
ventana_principal.title("Ventana principal")
boton_abrir = ttk.Button(
    ventana_principal,
    text="Abrir ventana secundaria",
    command=abrir_ventana_secundaria
)
boton_abrir.place(x=100, y=100)
ventana_principal.mainloop()

Aquí la explicación: Ventanas secundarias en Tcl/Tk (tkinter).

Saludos
Muchísimas gracias Francisco. Me leo el link que has puesto. (Muy, muy útil como todos los que tiene esta web).

P.D. No te lo vas a creer pero ya lo tenía hecho en una de las ventanas de la app y ni me acordaba Ja ja ja.

self.advccl2 = tk.Toplevel()
self.advccl2.title("CREADOR DE AVISOS")
self.advccl2.geometry("710x350+500+200")
self.advccl2.resizable(False,False)
self.advccl2.transient(self.topCCL )
self.advccl2.grab_set()

Gracias de nuevo.
Responder
#4
El nombre del método no es del todo claro así que es fácil olvidárselo Big Grin

Saludos!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)