es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo modificar el `Texto` del elemento padre desde el nivel de los hijos en Tkinter (Python)

Tengo un archivo app.py donde se invoca la clase principal App(Tk). Dentro de él creo tres hijos, dos de los cuales son relevantes (en el medio y a la derecha de la imagen):

    self.active_module = main_module.MainModule(self.main)
    self.active_module.grid(column=1,row=0)

y

    self.preview = Text(self.main,state='disabled',width=50)
    self.preview.grid(column=2,row=0,sticky=E)

El active_module es un ttk.Notebook con varios ttk.Frame y separados en un archivo main_module.py. Uno de esos frames tiene un combobox con diferentes valores…

… y la pregunta es ¿cómo se puede modificar el Texto de preview al cambiar el valor del combobox? Para fines de claridad, adjunto la imagen de cómo se ve:

imagen

Las partes relevantes del código son las siguientes:

app.py

class App(Tk):
    def __init__(self):
        super().__init__()

    [...] 

    self.active_module = main_module.MainModule(self.main)
    self.active_module.grid(column=1,row=0)

    self.preview = Text(self.main,state='disabled',width=50)
    self.preview.grid(column=2,row=0,sticky=E)

main_module.py
“`
class MainModule(ttk.Notebook):
def <strong>init</strong>(self,parent):
super().<strong>init</strong>(parent)

<pre><code>self.add(General(self),text="General")
</code></pre>

class General(ttk.Frame):
def <strong>init</strong>(self,parent):
super().<strong>init</strong>(parent)

<pre><code>self.runtype_label = ttk.Label(self,text="Runtype:")
self.runtype_label.grid(column=0,row=0,sticky=W)
self.runtype_combobox = ttk.Combobox(self,state="readonly",values=("1","2","3"),width=9)
self.runtype_combobox.grid(column=1,row=0,sticky=W)
#self.runtype_combobox.bind('<<comboboxselected>>',self.runtype_choice)
</code></pre>

“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para modificar el texto de vista previa al cambiar el valor de la combobox, es necesario vincular el evento <<comboboxselected>> a una función que actualice el texto de vista previa preview. Aquí tienes un ejemplo:

    Primero, agrega el atributo self.preview_string a la clase App para almacenar el valor actual de la combobox:

    class App(Tk):
        def __init__(self):
            super().__init__()
    
            [...]
    
            self.preview_string = ""
    
            self.active_module = main_module.MainModule(self.main)
            self.active_module.grid(column=1, row=0)
    
            self.preview = Text(self.main, state='disabled', width=50)
            self.preview.grid(column=2, row=0, sticky=E)
    

    A continuación, modifica la función runtype_choice en la clase General para actualizar self.master.master.preview_string con el valor seleccionado de la combobox:

    class General(ttk.Frame):
        def __init__(self, parent):
            super().__init__(parent)
    
            self.runtype_label = ttk.Label(self, text="Tipo de ejecución:")
            self.runtype_label.grid(column=0, row=0, sticky=W)
            self.runtype_combobox = ttk.Combobox(self, state="readonly", values=("1", "2", "3"), width=9)
            self.runtype_combobox.grid(column=1, row=0, sticky=W)
            self.runtype_combobox.bind('<<comboboxselected>>', self.runtype_choice)
    
        def runtype_choice(self, event):
            self.master.master.preview_string = self.runtype_combobox.get()
    

    Finalmente, agrega una función a la clase App que actualice el texto de vista previa preview basándose en el valor actual de self.preview_string, y vincúlala al evento <<comboboxselected>> en la función __init__ de App:

    class App(Tk):
        def __init__(self):
            super().__init__()
    
            [...]
    
            self.preview_string = ""
    
            self.active_module = main_module.MainModule(self.main)
            self.active_module.grid(column=1, row=0)
    
            self.preview = Text(self.main, state='disabled', width=50)
            self.preview.grid(column=2, row=0, sticky=E)
    
            self.runtype_combobox.bind('<<comboboxselected>>', self.update_preview)
    
        def update_preview(self, event):
            self.preview.configure(state='normal')
            self.preview.delete('1.0', END)
            self.preview.insert(END, self.preview_string)
            self.preview.configure(state='disabled')
    

    Ahora, cada vez que el usuario seleccione un nuevo valor en la combobox, el texto de vista previa preview se actualizará con el nuevo valor. Ten en cuenta que este ejemplo asume que App es el maestro de MainModule, como se indica por el uso de self.master.master.preview_string en General. Si la relación entre las clases es diferente, es posible que necesites modificar este código en consecuencia.

Comments are closed.