2011-09-29 98 views
26

我試圖用Tkinter創建一個按鈕網格(以實現可點擊的單元格效果)。如何在tkinter中創建一個自調整大小的網格按鈕?

我的主要問題是,我不能讓grid和按鈕自動調整大小和適合父窗口。

例如,當我在網格上有很多按鈕時,不是縮小按鈕以使網格適合窗口內部,而是獲得延伸的框架,從屏幕上退出。

我在尋找的效果是填充所有可用空間的網格,然後調整其單元格的大小以適應該空間。我已閱讀文檔,但我仍然無法弄清楚如何使其工作。

這是基本的代碼這是我的出發點:

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() 

回答

39

您需要配置的行和列有非零權重,使他們會佔用額外的空間:

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

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

您還需要配置的按鈕,使他們擴展以填充細胞

btn.grid(column=x, row=y, sticky=N+S+E+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

謝謝!這很好。我不知道爲什麼我沒有找到網格類。我正在閱讀幾何管理器文檔,但只發現了.grid方法。 – Kiril

+1

當您在我的系統上調整它的大小時,您的示例沒有展開這些按鈕。我使用Xubuntu 14.04,32位。我在Python 2.x和3.x上都試過了。 – Shule

+0

非常有幫助的例子。 @Kiril - 你也可以從對象引用中調用columnconfigure,例如root.rowconfigure(0,weight = 1) – NargothBond

2

爲了使按鈕擴大時,窗口最大化,儘量如下修改button.grid進入:

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

@Vaughn Cato gave an excellent answer here。但是,他在他的例子中意外地包含了一堆無關的代碼。這裏是一個清理和更有組織的完整示例,完成他的示例。

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() 

截圖:

當它第一次打開(小):

enter image description here

後您最大化窗口:

enter image description here

相關問題