2011-09-29 16 views
26

Próbuję utworzyć siatkę przycisków (w celu uzyskania klikalnego efektu komórki) z Tkinter.Jak utworzyć samosadującą siatkę przycisków w tkinter?

Moim głównym problemem jest to, że nie mogę wykonać grid, a przyciski autoregulacji i dopasowania do okna nadrzędnego.

Na przykład, gdy mam dużą liczbę przycisków na siatce, zamiast kurczenia się przycisków, aby kratka mieściła się w oknie, otrzymuję rozciągniętą ramkę, która gaśnie z ekranu.

Efekt, którego szukam, to siatka wypełniająca całą dostępną przestrzeń, a następnie zmieniająca rozmiar komórek w celu dopasowania do tej przestrzeni. Czytałem w dokumentacji, ale nadal nie mogę dowiedzieć się, jak to zrobić.

Jest to kod podstawowy, który jest mój punkt wyjścia:

def __init__(self): 
    root = Tk() 
    frame = Frame(root) 
    frame.grid() 

    #some widgets get added in the first 6 rows of the frame's grid   

    #initialize grid 
    grid = Frame(frame) 
    grid.grid(sticky=N+S+E+W, column=0, row=7, columnspan=2) 

    #example values 
    for x in range(60): 
     for y in range(30): 
      btn = Button(grid) 
      btn.grid(column=x, row=y) 

    root.mainloop() 

Odpowiedz

39

Musisz skonfigurować wierszy i kolumn mieć masę niezerową tak, że będą one zajmują dodatkowego miejsca:

for x in range(60): 
    Grid.columnconfigure(grid, x, weight=1) 

for y in range(30): 
    Grid.rowconfigure(grid, y, weight=1) 

Należy również skonfigurować przyciski tak, że będą one rozwiń, aby wypełnić komórkę:

btn.grid(column=x, row=y, sticky=N+S+E+W) 

To musi być zrobione przez całą drogę w górę, więc tutaj jest pełna przykładów:

from tkinter import * 

root = Tk() 
frame=Frame(root) 
Grid.rowconfigure(root, 0, weight=1) 
Grid.columnconfigure(root, 0, weight=1) 
frame.grid(row=0, column=0, sticky=N+S+E+W) 
grid=Frame(frame) 
grid.grid(sticky=N+S+E+W, column=0, row=7, columnspan=2) 
Grid.rowconfigure(frame, 7, weight=1) 
Grid.columnconfigure(frame, 0, weight=1) 

#example values 
for x in range(10): 
    for y in range(5): 
     btn = Button(frame) 
     btn.grid(column=x, row=y, sticky=N+S+E+W) 

for x in range(10): 
    Grid.columnconfigure(frame, x, weight=1) 

for y in range(5): 
    Grid.rowconfigure(frame, y, weight=1) 

root.mainloop() 
+1

Dzięki! To działało świetnie. Nie jestem pewien, dlaczego nie znalazłem klasy Grid. Czytałem dokumentację menedżerów geometrii, ale odkryłem tylko metodę .grid. – Kiril

+1

Twój przykład nie oznacza, że ​​przyciski rozwijają się podczas zmiany rozmiaru w moim systemie. Używam Xubuntu 14.04, 32-bit. Próbowałem go na obu Python 2.x i 3.x. – Shule

+0

Bardzo pomocny przykład. @Kiril - możesz również wywołać columnconfigure z odwołania do obiektu, np. root.rowconfigure (0, waga = 1) – NargothBond

2

Aby przyciski rozwijać, gdy okno jest zmaksymalizowane, spróbuj zmodyfikować wpis button.grid następująco :

btn.grid(column=x, row=y, sticky=N+S+E+W) 
7

@Vaughn Cato gave an excellent answer here. Jednak w swoim przykładzie przypadkowo włączył kilka dodatkowych kodów. Oto oczyszczony i bardziej zorganizowany pełny przykład wykonania dokładnie tego, co robi jego przykład.

from tkinter import * 

#Create & Configure root 
root = Tk() 
Grid.rowconfigure(root, 0, weight=1) 
Grid.columnconfigure(root, 0, weight=1) 

#Create & Configure frame 
frame=Frame(root) 
frame.grid(row=0, column=0, sticky=N+S+E+W) 

#Create a 5x10 (rows x columns) grid of buttons inside the frame 
for row_index in range(5): 
    Grid.rowconfigure(frame, row_index, weight=1) 
    for col_index in range(10): 
     Grid.columnconfigure(frame, col_index, weight=1) 
     btn = Button(frame) #create a button inside frame 
     btn.grid(row=row_index, column=col_index, sticky=N+S+E+W) 

root.mainloop() 

ekranu:

Gdy po raz pierwszy otwiera (małe):

enter image description here

Po zmaksymalizować okno:

enter image description here