Relleno especificado en estilo ignorado por Ttk Frame

El siguiente código funciona como se esperaba, presentando un botón de fondo rojo (con mucho relleno) en un marco de fondo verde (también con mucho relleno). Tenga en cuenta que el relleno de cuadros se especifica tanto en la statement de estilo como en la inicialización de ttk.Frame.

import ttk import Tkinter root = Tkinter.Tk() ttk.Style().configure("TFrame", background="#0c0", padding=60) ttk.Style().configure("TButton", background="#c00", padding=20) frame = ttk.Frame(root, padding=60) frame.pack() btn = ttk.Button(frame, text="Button") btn.pack() root.mainloop() 

Ahora, sin embargo, elimine la línea ‘padding = 60’ de la inicialización del marco (es decir, frame = ttk.Frame(root) ), dejándola solo en la statement de Style().configure(...) y la ventana que las ventanas emergentes no tienen relleno en el Marco (y, por lo tanto, tampoco se puede decir cuál es el color de fondo). En su lugar, solo está el botón de fondo rojo que ocupa toda la ventana. El relleno del cuadro ha vuelto a ser el predeterminado de 0 a pesar de la statement de estilo.

¿Por qué se ignora el relleno especificado para el estilo “TFrame”? El otro atributo (“fondo”) se aplica correctamente al Marco, y tanto el relleno como los atributos de fondo se aplican correctamente al Botón usando el estilo TButton.

El diseño de TFrame no incluye un elemento de relleno, por lo que no hay ningún elemento de estilo para utilizar el valor de relleno configurado en su estilo. Puedes ver esto inspeccionando el diseño:

 >>> from tkinter import * >>> from tkinter.ttk import * >>> style = Style() >>> style.theme_use('default') # select the Unix theme >>> style.layout("TFrame") [('Frame.border', {'sticky': 'nswe'})] 

Mirando algo que usa relleno como un TButton:

 >>> style.layout("TButton") [('Button.border', {'border': '1', 'children': [('Button.focus', {'children': [('Button.padding', {'children': [('Button.label', {'sticky': 'nswe'})], 'sticky': 'nswe'})], 'sticky': 'nswe'})], 'sticky': 'nswe'})] 

En este diseño tenemos un elemento “borde” que hará uso de las opciones de configuración de relief y relief de borderwidth . Un elemento de focus para tratar de mostrar el anillo de enfoque. Y también un elemento de padding para incluir una cantidad configurada de relleno.

El estilo TFrame no utiliza ningún elemento de relleno. Sin embargo, el widget Frame utiliza un valor de relleno de widget. Esto es usado por el propio widget para definir un relleno interno cuando se colocan los widgets contenidos. Esto no está cubierto por el estilo, sino como una opción específica del widget.