Configuración y Uso de Widgets Gráficos en Tkinter: Button, Entry y Text

El uso de opciones (Options) permite configurar las propiedades de los componentes gráficos, afectendo su estado, dimensiones, color, posición, etc. Existen tres métodos para ajustar estas opciones, aplicables de manera consistente a diversos widgets:

  1. Parámetros Nombrados (Argumantos de Palabra Clave) durante la Creación:
boton_ejemplo = Button(self, fg="red", bg="blue")

  1. Acceso tipo Diccionario después de la Creación:
boton_ejemplo['fg'] = 'red'
boton_ejemplo['bg'] = 'blue'

  1. Uso del Método config() después de la Creación:
boton_ejemplo.config(fg='red', bg='blue')

Para detalles adicionales, consulte la documentación oficial de Tkinter.

El Widget Button

El Button se utiliza para manejar las interacciones de clic del usuario. Puede mostrar texto o una imagen. Al ser presionado, ejecuta automáticamente la función asociada a su evento command.

"""
Ejemplo de uso del widget Button
"""
from tkinter import Tk, Frame, Button, PhotoImage, messagebox

class AplicacionBotones(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.crear_widgets()

    def crear_widgets(self):
        # Botón con texto
        self.btn_login = Button(root, text='Ingresar', width=6, height=3, anchor='e', command=self.iniciar_sesion)
        self.btn_login.pack()

        # Botón con imagen (asegúrate de que la ruta sea correcta)
        try:
            global imagen_boton
            # Reemplaza 'ruta/a/tu/imagen.gif' con la ruta real de tu archivo GIF.
            imagen_boton = PhotoImage(file='ruta/a/tu/imagen.gif')
            self.btn_imagen = Button(root, image=imagen_boton, command=self.iniciar_sesion)
            self.btn_imagen.pack()
        except Exception as e:
            print(f"Error al cargar la imagen: {e}")
            messagebox.showerror("Error de Imagen", "No se pudo cargar el archivo de imagen.")

    def iniciar_sesion(self):
        messagebox.showinfo('Sistema', '¡Inicio de sesión exitoso!')

if __name__ == '__main__':
    root = Tk()
    root.geometry('500x300+200+200')
    root.title('Ejemplo de Botones')
    app = AplicacionBotones(master=root)
    app.mainloop()

El Widget Entry (Campo de Texto de una Sola Línea)

El Entry es ideal para la entrada de texto en una sola línea. Si el texto excede el ancho del widget, se desplazará automáticamente. Para entradas de múltiples líneas, se debe utilizar el widget Text.

"""
Ejemplo de uso del widget Entry
"""
from tkinter import Tk, Frame, Label, Entry, Button, StringVar, messagebox

class AplicacionEntry(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.crear_widgets()

    def crear_widgets(self):
        # Campo de usuario
        self.lbl_usuario = Label(self, text='Usuario')
        self.lbl_usuario.pack()

        self.var_usuario = StringVar()
        self.entry_usuario = Entry(self, textvariable=self.var_usuario)
        self.entry_usuario.pack()
        self.var_usuario.set('usuario_predeterminado') # Valor por defecto

        # Campo de contraseña
        self.lbl_contrasena = Label(self, text='Contraseña')
        self.lbl_contrasena.pack()

        self.var_contrasena = StringVar()
        self.entry_contrasena = Entry(self, textvariable=self.var_contrasena, show='*') # Oculta la entrada
        self.entry_contrasena.pack()
        self.var_contrasena.set('contraseña_secreta') # Valor por defecto

        # Botón de inicio de sesión
        self.btn_submit = Button(self, text='Entrar', command=self.verificar_credenciales)
        self.btn_submit.pack()

    def verificar_credenciales(self):
        usuario = self.var_usuario.get()
        contrasena = self.var_contrasena.get()
        print(f'Usuario: {usuario}')
        print(f'Contraseña: {contrasena}')

        if usuario == 'admin' and contrasena == '12345':
            messagebox.showinfo('Acceso', '¡Credenciales correctas!')
        else:
            messagebox.showerror('Acceso', 'Credenciales inválidas.')

if __name__ == '__main__':
    root = Tk()
    root.geometry('500x300+200+200')
    root.title('Ejemplo de Campos de Texto')
    app = AplicacionEntry(master=root)
    app.mainloop()


El Widget Text (Campo de Texto Multilínea)

El widget Text es versátil, permitiendo la visualización de texto multilínea, hipervínculos, imágenes, e incluso la intergación de otros widgets. Esto lo convierte en una base para editores de texto simples o navegadores web básicos.

"""
Ejemplo de uso del widget Text
"""
from tkinter import Tk, Frame, Button, Text, PhotoImage, messagebox, INSERT, END
import webbrowser

class AplicacionText(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.crear_widgets()

    def crear_widgets(self):
        # Widget Text
        self.txt_editor = Text(root, width=40, height=12, bg='lightgray')
        self.txt_editor.pack()

        # Inserción inicial de texto
        self.txt_editor.insert(1.0, 'Línea inicial de texto.\n')
        self.txt_editor.insert('2.3', 'Texto insertado en línea 2, columna 3.\n')
        self.txt_editor.insert(END, 'Texto al final del contenido.\n')

        # Botones de control
        btn_insertar = Button(self, text='Insertar', command=self.insertar_texto)
        btn_insertar.pack(side='left')
        btn_obtener = Button(self, text='Obtener', command=self.obtener_texto)
        btn_obtener.pack(side='left')
        btn_imagen = Button(self, text='Insertar Imagen', command=self.insertar_imagen)
        btn_imagen.pack(side='left')
        btn_widget = Button(self, text='Insertar Widget', command=self.insertar_widget)
        btn_widget.pack(side='left')
        btn_tags = Button(self, text='Ejemplo Tags', command=self.ejemplo_tags)
        btn_tags.pack(side='left')

    def insertar_texto(self):
        self.txt_editor.insert(INSERT, 'Texto agregado en cursor. ')
        self.txt_editor.insert(END, '[Fin]')

    def obtener_texto(self):
        contenido_completo = self.txt_editor.get(1.0, END)
        print('--- Contenido del Editor ---')
        print(contenido_completo)
        print('--- Fin del Contenido ---')
        # Ejemplo de obtención de un rango específico
        rango_texto = self.txt_editor.get('1.15', '1.25') # Obtiene de char 15 a 25 en la línea 1
        print(f'Texto en rango específico: {rango_texto}')


    def insertar_imagen(self):
        try:
            # Reemplaza 'ruta/a/tu/imagen.gif' con la ruta real de tu archivo GIF.
            self.img_tk = PhotoImage(file='ruta/a/tu/imagen.gif')
            self.txt_editor.image_create(END, image=self.img_tk)
        except Exception as e:
            print(f"Error al cargar imagen para Text: {e}")
            messagebox.showerror("Error de Imagen", "No se pudo cargar el archivo de imagen para el widget Text.")

    def insertar_widget(self):
        btn_interno = Button(self.txt_editor, text='Widget Interno')
        # Crea el widget dentro del Text widget
        self.txt_editor.window_create(INSERT, window=btn_interno)

    def ejemplo_tags(self):
        self.txt_editor.delete(1.0, END)
        self.txt_editor.insert(INSERT, 'Texto de ejemplo con tags.\n')
        self.txt_editor.insert(END, 'Visita Baidu.com\n')

        # Configuración de un tag 'destacado'
        self.txt_editor.tag_add('destacado', '1.0', '1.20')
        self.txt_editor.tag_config('destacado', background='yellow', foreground='red', font=('Arial', 10, 'bold'))

        # Configuración de un tag 'enlace_baidu' para un hipervínculo
        self.txt_editor.tag_add('enlace_baidu', '2.0', '2.12') # Texto 'Visita Baidu.com'
        self.txt_editor.tag_config('enlace_baidu', underline=True, foreground='blue')
        self.txt_editor.tag_bind('enlace_baidu', '<Button-1>', self.abrir_baidu)

    def abrir_baidu(self, event):
        webbrowser.open('http://www.baidu.com')

if __name__ == '__main__':
    root = Tk()
    root.geometry('500x300+200+200')
    root.title('Ejemplo de Widget Text')
    app = AplicacionText(master=root)
    app.mainloop()

Etiquetas: tkinter Python gui widget button

Publicado el 7-27 12:50