Foros Python

Versión completa: Modificar atributos del programa principal desde ventana de Tkinter
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas:

Estoy haciendo una aplicación y me gustaría saber si puedo realizar cambios desde una ventana de uno de los botones del programa principal y que este cambio sea "definitivo" hasta que yo lo vuelva a cambiar.

Me explico:

Tengo una ventana principal con dos botones : "MODIFICAR" y "SALIR".

Para más info(Simplifico la cosa para que sea más claro:

main = Tk()

boton= ttk.Button(main, text="MODIFICAR", command=mod)
boton.grid(row=1, column=1)

boton1 = ttk.Button(main, text="SALIR")
boton1.grid(row=1, column=1)

Al pulsar el boton "MODIFICAR" se abre otra ventana dónde añado otro boton para  la modificación del texto del boton "SALIR"

def cambio():
boton1.configure(text="SALIDO"

def mod():
mod = Toplevel()
boton2 = ttk.Button(mod, text='CAMBIAR' command=cambio)

Bien en principio funciona todo pero si cierras la ventana principal main.destroy(). Si vuelves a abrila el boton sigue teniendo el texto "SALIR" y no "SALIDO" como pretendo.

No sé si me explico bien
Hola. Si tu ventana principal se cierra y abre varias veces durante la ejecución de tu programa, sencillamente podés guardar el texto del botón en una variable. Si te referís a que el cambio persista una vez cerrado el programa entonces tendrías que guardar el texto en un archivo.

Saludos
(09-03-2019, 03:23 PM)Francisco escribió: [ -> ]Hola. Si tu ventana principal se cierra y abre varias veces durante la ejecución de tu programa, sencillamente podés guardar el texto del botón en una variable. Si te referís a que el cambio persista una vez cerrado el programa entonces tendrías que guardar el texto en un archivo.

Saludos

Buenas,

Muchas gracias.

No no es el programa principal dónde está el botón lo que se cerraría. Es una función (Toplevel) dentro de otra función(Toplevel). Aún no he dado con ello. A ver como lo explico.....

Tengo una app (Ventana Tk()), con un botón que mediante una función abre otra ventana (Toplevel) dónde hay un botón cuyo texto es un nº de teléfono(Para llamar a dicho teléfono de un solo click).

La idea es poder cambiar ese nº de teléfono del botón para que una vez cambiado y pulse ese botón llame al teléfono ya modificado. Lo que no puedo hacer es que si cierro esa ventana con el botón dónde está el nº de teléfono. (ventana.destroy()), al abrirla de nuevo (Sin haber cerrado la app (Ventana Tk) vuelve a tener el nº de teléfono original y me gustaría que tuviera el nº de teléfono modificado hasta que yo decida por supuesto volver a poner el nº original.

Ya sé que me explico como un libro cerrado.
Entiendo lo que decís, en ese caso tenés que usar una variable global que contenga el texto del botón (si la creas adentro del Toplevel se va a perder cuando se cierre).

Código:
import tkinter as tk


toplevel = None
text = "Texto original"


def open_window():
    global toplevel
    
    def change_text():
        # Aquí se cambia el valor de la variable global `text`
        # y al mismo tiempo se actualiza el texto del botón 3.
        global text
        text = entry1.get()
        button3.config(text=text)
    
    toplevel = tk.Toplevel()
    entry1 = tk.Entry(toplevel)
    entry1.pack()
    button2 = tk.Button(toplevel, text="Cambiar texto",
                        command=change_text)
    button2.pack()
    button3 = tk.Button(toplevel, text=text)
    button3.pack()


root = tk.Tk()
button1 = tk.Button(root, text="Abrir ventana", command=open_window)
button1.pack()
root.mainloop()

Si tu código está orientado a objetos queda más legible y no hay necesidad de usar variables globales.

Saludos
(12-03-2019, 09:33 PM)Francisco escribió: [ -> ]Entiendo lo que decís, en ese caso tenés que usar una variable global que contenga el texto del botón (si la creas adentro del Toplevel se va a perder cuando se cierre).

Código:
import tkinter as tk


toplevel = None
text = "Texto original"


def open_window():
   global toplevel
   
   def change_text():
       # Aquí se cambia el valor de la variable global `text`
       # y al mismo tiempo se actualiza el texto del botón 3.
       global text
       text = entry1.get()
       button3.config(text=text)
   
   toplevel = tk.Toplevel()
   entry1 = tk.Entry(toplevel)
   entry1.pack()
   button2 = tk.Button(toplevel, text="Cambiar texto",
                       command=change_text)
   button2.pack()
   button3 = tk.Button(toplevel, text=text)
   button3.pack()


root = tk.Tk()
button1 = tk.Button(root, text="Abrir ventana", command=open_window)
button1.pack()
root.mainloop()

Si tu código está orientado a objetos queda más legible y no hay necesidad de usar variables globales.

Saludos

Muchas Gracias. Aún no he podido probar porque ando liado con otra cosa de la app. Cuando lo pruebe te comento.