Search code examples
pythontkinterlabelframettkbootstrap

Problem placing or dividing frames in the window (Python with Tkinter/TTKbootstrap)


I'm trying to put two Labels next to each other but I want one to cover half the window and the other the other half but I've tried everything but nothing happens they just stay in that corner

how I wanted it to be

I wanted them to look the way I draw them in the image but they just stay there in the corner

from textwrap import fill
import tkinter as tk
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from PIL import Image, ImageTk


class APP:

    def __init__(self):
        # Criando a janela principal
        self.root = tk.Tk()
        self.root.title("FMD")
        self.root.geometry("1080x600")  # Define o tamanho da janela
        # Impede o redimensionamento da janela
        self.root.resizable(False, False)

        # Carregando a imagem existente
        background_image = Image.open("background.png")

        # Convertendo a imagem para o formato Tkinter PhotoImage
        self.background_photo = ImageTk.PhotoImage(background_image)

        # Criando um rótulo com a imagem como plano de fundo
        self.background_label = tk.Label(
            self.root, image=self.background_photo)
        self.background_label.place(x=0, y=0, relwidth=1, relheight=1)

        # Criando o frame do Dataset
        self.dataset_frame = ttk.Frame(self.root, bootstyle="dark")
        self.dataset_frame.grid(row=0, column=0)

        self.dataset_label = ttk.Label(
            self.dataset_frame, text="Dataset:", bootstyle="inverse-dark")
        self.dataset_label.configure(font=("Arial", 16, "bold"))
        self.dataset_label.pack(side=LEFT)

        # Criando o frame do preview
        self.preview_frame = ttk.Frame(self.root, bootstyle="dark")
        self.preview_frame.grid(row=0, column=1)

        self.preview_label = ttk.Label(
            self.preview_frame, text="Preview:", bootstyle="sucess")
        self.preview_label.configure(font=("Arial", 16, "bold"))
        self.preview_label.pack(side=LEFT)

        # Inicia o loop principal da aplicação
        self.root.mainloop()


# Inicializa a aplicação
app = APP()

Solution

  • I switched Grid to pack ( please anyone correct me if I am wrong but I could not find a way to 'easily' configure the grid column ). By using winfo_width() you can get the width of the window/object.

    from tkinter import *
    
    #Tendrás que volver a agregar todas las imágenes e 
    # importaciones, las eliminé para poder probarlas.
    
    class APP:
    
        def __init__(self):
            # Criando a janela principal
            self.root = Tk()
            self.root.title("FMD")
            self.root.geometry("1080x600")  # Define o tamanho da janela
            # Impede o redimensionamento da janela
            self.root.resizable(False, False)
    
            # Criando o frame do Dataset
            
            # Esto actualiza los datos 'raíz' utilizados para obtener el ancho.
            self.root.update()
            
            # A continuación, obtenga el ancho de la aplicación y divídalo por dos.
            self.dataset_frame = Frame(self.root, width=round(self.root.winfo_width()/2), height=30)
            self.dataset_frame.pack(side=LEFT, anchor=NW)
            
            # Esto está aquí para que el marco no colapse (sin esta línea el marco tendrá un tamaño: 0x0)
            self.dataset_frame.pack_propagate(False)
    
            self.dataset_label = Label(self.dataset_frame, text="Dataset:", font=("Arial", 16, "bold"))
            self.dataset_label.pack()
    
            # Criando o frame do preview
            self.preview_frame = Frame(self.root, width=round(self.root.winfo_width()/2), height=30)
            self.preview_frame.pack(side=LEFT, anchor=NW)
            self.preview_frame.pack_propagate(False)
    
            self.preview_label = Label(self.preview_frame, text="Preview:", font=("Arial", 16, "bold"))
            self.preview_label.pack()
    
            # Inicia o loop principal da aplicação
            self.root.mainloop()
    
    
    # Inicializa a aplicação
    app = APP()