web-dev-qa-db-fra.com

Comment centrer horizontalement un widget en utilisant grid ()?

J'utilise grid() pour placer des widgets dans une fenêtre tkinter. J'essaie de mettre une étiquette sur le centre horizontal d'une fenêtre et de la laisser y rester, même si la fenêtre est redimensionnée. Comment pourrais-je m'y prendre?

Je ne veux pas utiliser pack(), soit dit en passant. Je voudrais continuer à utiliser grid().

9
L4undry

Il n'y a pas d'astuce - le widget est centré dans la zone qui lui est allouée par défaut. Placez simplement une étiquette dans une cellule sans aucun attribut sticky et elle sera centrée.

Maintenant, l'autre question est de savoir comment obtenir la zone qui lui est allouée pour être centrée. Cela dépend de nombreux autres facteurs, tels que les autres widgets, leur disposition, etc.

Voici un exemple simple montrant une seule étiquette centrée. Il le fait en s'assurant que la ligne et la colonne dans lesquelles il se trouve occupent tout l'espace supplémentaire. Notez que l'étiquette reste centrée, quelle que soit la taille de la fenêtre.

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="This should be centered")
        label.grid(row=1, column=1)
        self.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(1, weight=1)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).grid(sticky="nsew")
    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)
    root.mainloop()

Vous pouvez obtenir un effet similaire en donnant un poids à toutes les lignes et colonnes sauf celui avec l'étiquette.

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="This should be centered")
        label.grid(row=1, column=1)

        self.grid_rowconfigure(0, weight=1)
        self.grid_rowconfigure(2, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.grid_columnconfigure(2, weight=1)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).grid(sticky="nsew")
    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)

    root.mainloop()
12
Bryan Oakley

Il n'y a rien de spécial requis. Un widget sera automatiquement au milieu de son parent. Ce qui est nécessaire pour dire au parent de remplir tout l'espace disponible.

from tkinter import *
root = Tk()
root.geometry("500x500+0+0")
frmMain = Frame(root,bg="blue")

startbutton = Button(frmMain, text="Start",height=1,width=4)
startbutton.grid()

#Configure the row/col of our frame and root window to be resizable and fill all available space
frmMain.grid(row=0, column=0, sticky="NESW")
frmMain.grid_rowconfigure(0, weight=1)
frmMain.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

root.mainloop()

Cela utilise la grille plutôt que le pack pour placer les widgets et la grille est configurée pour remplir toute la taille de la fenêtre. Le bouton apparaîtra au centre quelle que soit la taille de la fenêtre.

1
scotty3785