Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Problemas con método .grid()
#1
Buenas:

Una pregunta. Como dice el título estoy teniendo problemas en colocar los "widgets" dentro de la ventana principal. Me separa dichos widgets de una manera exagerada a pesar de estar estos dentro de distintos frames y no utilizar ni padx ni pady.

Os mando una imagen. No entiendo porque se separan de esa manera los frames. Debería estar todo "pegados" unos junto a otros y sin embargo me los separa de esa manera tan exagerada. (Sobre todo la separación de la etiqueta con fondo amarillo con respecto al resto)

¿Alguna idea?

Y ya que estamos por si esto no tuviera solución, ¿sería posible mezclar distintos métodos en distintas ventanas es decir .pack() en una ventana y .grid() en otra?

Muchas Gracias de antemano.


Archivos adjuntos Miniatura(s)
   
Responder
#2
Hola. Recordá que el posicionamiento vía grid() trabaja con columnas y filas. Pareciera que tu etiqueta con fondo amarillo está ocupando tres columnas, viéndolo en comparación con los controles que están abajo, y en ese caso tiene sentido que aparezca centrado ya que es el comportamiento por defecto. Pero sin el código no puedo ayudarte mucho más. Sí es posible mezclar los distintos sistemas de posicionamiento.

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
(08-12-2019, 11:01 PM)Francisco escribió: Hola. Recordá que el posicionamiento vía grid() trabaja con columnas y filas. Pareciera que tu etiqueta con fondo amarillo está ocupando tres columnas, viéndolo en comparación con los controles que están abajo, y en ese caso tiene sentido que aparezca centrado ya que es el comportamiento por defecto. Pero sin el código no puedo ayudarte mucho más. Sí es posible mezclar los distintos sistemas de posicionamiento.

Saludos
Muchas Gracias.

No he puesto el código porque se me está yendo de las manos y es larguísimo. Lo tengo todo por defecto. Te mando una pequeña parte del código a ver si así te sirve de más ayuda. A mí lo único que se me ocurre es "forzar" al método .grid() a que use única y exclusivamente una fila y una columna independientemente del tamaño de la etiqueta y de la fuente.

Este es el código de los frame:

Código:
self.frameappccd1 = ttk.Frame(self.appccd, style="Frames.TFrame")
self.frameappccd1.grid(row=0, column=0)

self.frameappccd2 = ttk.Frame(self.appccd, style="Frames.TFrame")
self.frameappccd2.grid(row=0, column=1)

self.frameappccd3 = ttk.Frame(self.appccd, style="Frames.TFrame")
self.frameappccd3.grid(row=0, column=2)

self.frameappccd4 = ttk.Frame(self.appccd, style="Frames.TFrame")
self.frameappccd4.grid(row=0, column=3)

self.frameappccd5 = ttk.Frame(self.appccd, style="Frames.TFrame")
self.frameappccd5.grid(row=1, column=0)

self.frameappccd6 = ttk.Frame(self.appccd, style="Frames.TFrame")
self.frameappccd6.grid(row=1, column=1)

self.frameappccd7 = ttk.Frame(self.appccd, style="Frames.TFrame")
self.frameappccd7.grid(row=1, column=2)

El Código de las Etiquetas (Sobre todo la de fondo amarillo):

Código:
self.labappccdcat = ttk.Label(self.frameappccd1, text='C.A.T', font=('DejaVu Sans Condensed', 12, 'bold'), relief='groove', borderwidth=5, background='light green', justify='center')
self.labappccdcat.grid(row=0, column=0)

self.labappccdCAT = ttk.Label(self.frameappccd1, text=CAT, font=('DejaVu Sans Condensed', 20, 'bold'), relief='sunken', background='#EAFF92', borderwidth=2, foreground='dark blue')
self.labappccdCAT.grid(row=1, column=0, pady=5)

self.alertaappccd = ttk.Label(self.frameappccd2, text='ALERTANTE', font=('DejaVu Sans Condensed', 12, 'bold'), relief='groove', borderwidth=2, background='light green')
self.alertaappccd.grid(row=0, column=0)

self.talertaappccd = ttk.Label(self.frameappccd2, text='TLF.ALERTANTE', font=('DejaVu Sans Condensed', 12, 'bold'), relief='groove', borderwidth=2, background='light green')
self.talertaappccd.grid(row=0, column=1)

Esta es una pequeña parte del código porque como ya digo es larguísimo.
Responder
#4
Vale chicos. SOLUCIONADO. (a medias)



Son tantas cosas en la cabeza para hacer la aplicación completa que muchas veces nos olvidamos de lo básico y cometo errores absurdos.



Tema de sticky en el frame con el método .grid().



Tan sencillo como añadir en los frames la posición de los widgets.

 
Código:
self.frameappccd1 = ttk.Frame(self.appccd, style="Frames.TFrame")

self.frameappccd1.grid(row=0, column=0, sticky='nw')



Muchas gracias aún así porque tú respuesta me ha inspirado para encontrar la solución a medias.

La etiqueta con fondo amarillo ya aparece dónde tiene que estar o al menos dónde yo la quiero. Aún sigo con las las otras etiquetas para que se "peguen" a la derecha de la etiqueta con fondo amarillo.

Os mando imagen de como va quedando. (Si alguien tiene idea de como solucionar lo del resto de los frames......)

La solución definitiva viene haciendo muchos menos frames pero me gustaría saber si es posible dividir cada widget en un frame y como unirlos.


Archivos adjuntos Miniatura(s)
       
Responder
#5
Buenas reabro el tema por que ya es una cuestión de orgullo y me toca la moral.



No sé si es que con el método grid no se puede hacer o yo que soy muy torpe. He mirado mil soluciones en internet y ninguna soluciona el problema.



Os pongo un código sencillito:

Código:
import tkinter as tk

from tkinter import ttk

from datetime import *

from tkinter import messagebox

import time

import calendar

import psycopg2

import threading

from threading import Timer

import os

import sys

import tkinter.font as tkfont

from functools import partial

import subprocess







class Appprueba:

    

    def __init__(self):

       

        self.ventana = tk.Tk()

        self.ventana.title('FRAMES LAYOUT')

        self.ventana.geometry('700x150')        



        # FRAMES



        self.frame01 = ttk.Frame(self.ventana)

        self.frame01.grid(row=0, column=0, pady=5)         

       

        self.frame02 = ttk.Frame(self.ventana)

        self.frame02.grid(row=0, column=1, pady=5)



        self.frame03 = ttk.Frame(self.ventana)

        self.frame03.grid(row=1, column=0, pady=5)



        self.frame04 = ttk.Frame(self.ventana)

        self.frame04.grid(row=1, column=1, pady=5)





        # ENTRY         

       

        self.entry01 = ttk.Entry(self.frame01, width=35)

        self.entry01.grid(row=0, column=0, padx=5, pady=5)



        # BUTTONS



        self.button01 = ttk.Button(self.frame02, text='PRUEBA')

        self.button01.grid(row=0, column=0, sticky=tk.W)



        # LABEL



        self.label01 = ttk.Label(self.frame03, text='ETIQUETA SUPERLARGA', relief='raised', anchor=tk.CENTER, font=("DejaVu Sans Condensed",12,'bold'))

        self.label01.grid(row=0, column=0, ipadx=5, sticky=tk.W)



        self.label02 = ttk.Label(self.frame04, text='ETIQUETA AÚN MUCHO MÁS SUPERLARGA', relief='raised', anchor=tk.CENTER, font=("DejaVu Sans

        Condensed",12,'bold'))



        self.label02.grid(row=0, column=0)





        self.ventana.mainloop()





def main():

     my_app = Appprueba()



if __name__ == '__main__':

     main()

Bueno, soy incapaz de hacer que el botón aparezca pegado al entry. No hay manera. Tampoco puedo hacer que la etiqueta 02 aparezca "pegada" la etiqueta 01.
He probado con grid_propagate(), grid_resize(), grid_rowconfigure() o grid_columnconfigure() y nada de nada. Ya digo es una cuestión de orgullo porque me toca la moral. El grid_propagate(False), en principio parece que funciona pero desgraciadamente quita los widgets que hay dentro.

Parece que los frames adquieren el tamaño de los widgets que tienen dentro pero el problema es que todos los widgets que añades en distinta fila adquieren dicho tamaño y no encuentro la manera de solucionarlo.

Esto es lo que quiero llegar a poder hacerSadEs una imagen hecha con gimp pero da una idea de lo que quiero)


Archivos adjuntos Miniatura(s)
   
Responder
#6
Hola, ¿cómo estás?

Tené en cuenta este código:

Código:
self.button01 = ttk.Button(self.frame02, text='PRUEBA')
self.button01.grid(row=0, column=0, sticky=tk.W)

Acá le estás diciendo a Tk que button01 tiene que pegarse a la izquierda (tk.W = West = Oeste) del control padre, que es frame02. Eso efectivamente está ocurriendo, pero frame02 tiene prácticamente el mismo tamaño que button01, por lo que el resultado es imperceptible. Lo que querés que se pegue a tu caja de texto es en realidad tu frame02, así que deberías cambiar:

Código:
self.frame02.grid(row=0, column=1, pady=5)

por:

Código:
self.frame02.grid(row=0, column=1, pady=5, sticky=tk.W)

Como sea, no veo por qué debes crear un frame por cada widget, eso no es para nada necesario.

Saludos!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#7
MUCHAS GRACIAS Francisco.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)