notebook - Python & ttk Uso de LabelFrames para limpiar un marco
pandas python (1)
Estoy intentando construir una GUI básica usando ttk / Tkinter.
He trazado una GUI básica que tiene los componentes básicos correctos, pero cuando intento embellecerla / espaciarla, llego al límite de obtener contenedores de ttk para jugar bien ...
Ejemplos:
from Tkinter import *
import ttk
class MakeGUI(object):
def __init__(self,root):
self.root = root
self.root.title("Text Comparitor")
## build frame
self.mainframe = ttk.Frame(self.root, padding="3 3 12 12")
self.mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
self.mainframe.columnconfigure(0, weight=1)
self.mainframe.rowconfigure(0, weight=1)
self.mainframe.pack()
## text labels
ttk.Label(self.mainframe, text="Conversion Truth Tester", font=("Helvetica", 32)).grid(column=1, row=1, sticky=E)
self.mainframe.pack(side="bottom", fill=BOTH, expand=True)
self.mainframe.grid()
ttk.Label(self.mainframe, text="Source Filename:").grid(column=1, row=2, sticky=W)
ttk.Label(self.mainframe, text="Source Text:").grid(column=1, row=3, sticky=W)
ttk.Label(self.mainframe, text="Converted Text:").grid(column=1, row=4, sticky=W)
ttk.Label(self.mainframe, text="Cleaned Source:").grid(column=1, row=5, sticky=W)
ttk.Label(self.mainframe, text="Cleaned Converted:").grid(column=1, row=6, sticky=W)
ttk.Label(self.mainframe, text="Details:").grid(column=1, row=7, sticky=W)
## buttons
self.close = ttk.Button(self.mainframe, text="Close",command=self.closeFrame).grid(column=1, row=9, sticky=SE)
self.next = ttk.Button(self.mainframe, text="Next",command=self.nextPara).grid(column=1, row=9, sticky=S)
self.next = ttk.Button(self.mainframe, text="Prev",command=self.prevPara).grid(column=1, row=9, sticky=SW)
def closeFrame(self):
self.root.destroy()
def nextPara(self):
pass
def prevPara(self):
pass
def main():
root = Tk()
makeGUI = MakeGUI(root)
root.mainloop()
if __name__ == ''__main__'':
main()
Lo que resulta en:
He intentado agregar un segundo objeto contenedor, un marco de etiqueta para contener los objetos de la etiqueta de texto, lo que hace que los botones se muevan más hacia arriba (así que supongo que no estoy haciendo referencia correctamente al labelframe en la cuadrícula:
from Tkinter import *
import ttk
class MakeGUI(object):
def __init__(self,root):
self.root = root
self.root.title("Text Comparitor")
## build frame
self.mainframe = ttk.Frame(self.root, padding="3 3 12 12")
self.mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
self.mainframe.columnconfigure(0, weight=1)
self.mainframe.rowconfigure(0, weight=1)
self.mainframe.pack()
## text labels
ttk.Label(self.mainframe, text="Conversion Truth Tester", font=("Helvetica", 32)).grid(column=1, row=1, sticky=E)
self.lfdata = ttk.Labelframe(self.root, labelwidget=self.mainframe, text=''Label'')#
self.lfdata.grid()
ttk.Label(self.lfdata, text="Source Filename:").grid(column=1, row=2, sticky=W)
ttk.Label(self.lfdata, text="Source Text:").grid(column=1, row=3, sticky=W)
ttk.Label(self.lfdata, text="Converted Text:").grid(column=1, row=4, sticky=W)
ttk.Label(self.lfdata, text="Cleaned Source:").grid(column=1, row=5, sticky=W)
ttk.Label(self.lfdata, text="Cleaned Converted:").grid(column=1, row=6, sticky=W)
ttk.Label(self.lfdata, text="Details:").grid(column=1, row=7, sticky=W)
## buttons
self.close = ttk.Button(self.mainframe, text="Close",command=self.closeFrame).grid(column=1, row=9, sticky=SE)
self.next = ttk.Button(self.mainframe, text="Next",command=self.nextPara).grid(column=1, row=9, sticky=S)
self.next = ttk.Button(self.mainframe, text="Prev",command=self.prevPara).grid(column=1, row=9, sticky=SW)
def closeFrame(self):
self.root.destroy()
def nextPara(self):
pass
def prevPara(self):
pass
def main():
root = Tk()
makeGUI = MakeGUI(root)
root.mainloop()
if __name__ == ''__main__'':
main()
Lo que resulta en: Tenga en cuenta el cambio de posiciones entre botones y etiquetas, y los aspectos casi visibles del labelframe.
Intento que la segunda versión parezca una versión más bonita de la 1ra.
Cualquier sugerencia: he estado leyendo los diferentes recursos / documentos, y no encuentro nada que se adapte a mi ejemplo (lo más probable es que estoy haciendo algo tonto ...) y nada de lo que he intentado ha funcionado todavía, incluso pack()
, grid()
y otros fragmentos que he encontrado en otros ejemplos relacionados.
Hay muchos lugares que requieren ajustes, permítanos comentar sobre ellos (probablemente me olvidaré de algo, así que asegúrese de verificar el código en la parte inferior).
En primer lugar, aplicar ponderaciones a columnas / filas solo en el marco no va a hacer que se expanda a medida que cambia el tamaño de la ventana. Tienes que hacerlo en la root
. Después de eso, es posible que desee hacerlo en el marco, para que coincida con sus expectativas sobre el diseño después de un cambio de tamaño. En su caso, lo que tiene más sentido es hacer que cada columna tenga el mismo peso> 0 y solo hacer que la segunda fila tenga un peso> 0. El razonamiento para las columnas es que tiene 3 botones, y querrá que todos se expandan en el espacio libre de la misma manera. Para la segunda parte, es una observación directa, ya que tiene un Labelframe
en la segunda fila. Dar un peso> 0 para cualquier otra fila te dará un diseño muy extraño. Problemas de ponderación realizados.
Lo siguiente que observé fue su etiqueta principal con una fuente más grande. Ciertamente desea que abarque 3 columnas (de nuevo, este número 3 está relacionado con la fila de botones que creará más adelante). También puede querer que el texto se centre en estas 3 columnas (no estoy seguro de sus preferencias aquí).
Ahora el Labelframe
que creas. Simplemente está mal, la opción de labelwidget
no significa lo que crees que es. Especifica un widget de Label
para servir como etiqueta para este marco de etiqueta. Por lo tanto, especificar su marco principal para este parámetro no tiene sentido. Tal vez desee especificar que algún texto sea visible en una determinada posición en el marco de la etiqueta. Además, este marco de la etiqueta debe estar alineado con una columna de 3 también.
Para la "grilla" en general, recomiendo especificar la opción in_
, para que quede claro en relación a qué widget está "cuadriculado". Con eso, resulta obvio comenzar en column=0, row=0
cada vez que profundices en tu nivel de crianza de tus widgets.
Así es como ajusté tu código:
import Tkinter
import ttk
class MakeGUI(object):
def __init__(self,root):
self.root = root
self.root.title(u"Title")
## build frame
self.mainframe = ttk.Frame(self.root, padding=(6, 6, 12, 12))
self.mainframe.grid(sticky=''nwse'')
for column in range(3):
self.mainframe.columnconfigure(column, weight=1)
self.mainframe.rowconfigure(1, weight=1)
## text labels
ttk.Label(self.mainframe, text=u"Label Title", anchor=''center'',
font=("Helvetica", 32)).grid(in_=self.mainframe,
column=0, row=0, columnspan=3, sticky="ew")
self.lfdata = ttk.Labelframe(self.mainframe, padding=(6, 6, 12, 12),
text=''Labelframe'')
self.lfdata.grid(column=0, columnspan=3, row=1, sticky=''nsew'')
info = (u"Source Filename", u"Source Text", u"Converted Text",
u"Cleaned Source", u"Cleaned Converted", u"Details")
for i, item in enumerate(info):
ttk.Label(self.lfdata, text=u"%s:" % item).grid(in_=self.lfdata,
column=0, row=i, sticky=''w'')
## buttons
btn = (u"Close", u"Next", u"Prev")
for i, item in enumerate(btn):
ttk.Button(self.mainframe, text=item).grid(in_=self.mainframe,
column=i, row=3)
def main():
root = Tkinter.Tk()
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
makeGUI = MakeGUI(root)
root.mainloop()
if __name__ == ''__main__'':
main()
Así es como se ve cuando se inicia el programa y después de cambiar el tamaño: