How to create a self resizing grid of buttons in tkinter?

前端 未结 4 718
后悔当初
后悔当初 2020-12-04 08:44

I am trying to create a grid of buttons(in order to achieve the clickable cell effect) with Tkinter.

My main problem is that I cannot make the grid and

相关标签:
4条回答
  • 2020-12-04 08:59

    @Vaughn Cato gave an excellent answer here. However, he has accidentally included a bunch of extraneous code in his example. Here is a cleaned up and more organized full example doing exactly what his example does.

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

    Screenshots:

    When it first opens (small):

    After you maximize the window:

    0 讨论(0)
  • 2020-12-04 08:59

    To make the buttons expand when the window is maximized, try to modify the button.grid entry as follows:

    btn.grid(column=x, row=y, sticky=N+S+E+W)
    
    0 讨论(0)
  • 2020-12-04 09:16

    The grid weight method might not work when you use scrollbar (at least in Mac) , so while using it pack the widget and scrollbar inside a frame and then grid the frame instead.

    0 讨论(0)
  • 2020-12-04 09:22

    You need to configure the rows and columns to have a non-zero weight so that they will take up the extra space:

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

    You also need to configure your buttons so that they will expand to fill the cell:

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

    This has to be done all the way up, so here is a full example:

    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()
    
    0 讨论(0)
提交回复
热议问题