Frame

Un Frame es un contenedor visual de widgets. Al ser un widget, una ventana, le corresponde una región rectangular de la pantalla. Una GUI compleja suele contener varios Frames que facilitan su diseño. Incluso se pueden crear interfaces gráficas que puedan ser reutilizadas en diferentes aplicaciones, para lo que se suele crear una clase nueva derivada de Frame.

El prototipo de tkinter.Frame es:

Frame(master=None, , cnf={}, **kw)

donde master es, generalmente, el widget en el que se quiere colocar el frame (root en aplicaciones que sólo tienen una ventana), y las opciones pueden ser:

background
bg
borderwidth
bd
class
colormap
container
cursor
height
highlightbackground
highlightcolor
highlightthickness
padx
pady
relief
takefocus
visual
width

El prototipo de tkinter.ttk.Frame es

Frame(master=None, **kw)

con las opciones estándar:

class
cursor
style
takefocus

y las opciones específicas

borderwidth
relief
padding
width
height

Ejemplos

Veamos las diferencias visuales de ambos frames:

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()

frameTK = tk.Frame(root)
frameTTK = ttk. Frame(root)

frameTK.pack()
frameTTK.pack()

tk.Label(frameTK, text="Frame tkinter.tk").pack()
ttk.Label(frameTTK, text="Frame tkinter.ttk").pack()

root.mainloop()

Comprobemos qué widgets incorpora Python cuando no lo especificamos en el código:

from tkinter import *
from tkinter.ttk import *

root = Tk()

frame1 = Frame(root)
frame2 =  Frame(root)

frame1.pack()
frame2.pack()

Label(frame1, text="Frame tkinter 1").pack()
Label(frame2, text="Frame tkinter 2").pack()

root.mainloop()

Intercambia las dos primeras líneas y comprueba el efecto ¿Qué widget muestra Python cuando tiene disponibles `tkinter.Frame` y `tkinter.ttk.Frame` y no le indicamos cuál queremos usar?

En el siguiente ejemplo sólo se usa el Frame para mejorar la apariencia de la aplicación, creando una separación entre sus dos etiquetas.

from tkinter import *

master = Tk()

Label(text="one").pack()

separator = Frame(height=2, bd=1, relief=SUNKEN)
separator.pack(fill=X, padx=5, pady=5)

Label(text="two").pack()

master.mainloop()

Gracias a los frames podemos cambiar la apariencia de la aplicación de forma sencilla.

import tkinter as tk
import tkinter.ttk as ttk

def Cambia():
    uno = (str(root.pack_slaves()[1]) == '.!frame')

    frame1.pack_forget()
    frame2.pack_forget()

    if uno:
        frame2.pack()
        frame1.pack()
    else:
        frame1.pack()
        frame2.pack()

root = tk.Tk()

ttk.Button(root, text='Cambia', command=Cambia).pack()

frame1 = ttk.Frame(root)
frame2 = ttk.Frame(root)

ttk.Label(frame1, text='Uno').pack()
ttk.Label(frame1, text='Dos').pack()

ttk.Label(frame2, text='Tres').pack()
ttk.Label(frame2, text='Cuatro').pack()

frame1.pack()
frame2.pack()

root.mainloop()

Referencias

results matching ""

    No results matching ""