How to make Tkinter columns of equal width when widgets span multiple columns (Python 2.7)

后端 未结 3 1786
Happy的楠姐
Happy的楠姐 2021-01-19 12:22

In the following, the buttons labelled \'ONE\', \'TWO\', and \'THR\' do not get evenly spaced out. It seems to me that the root of the problem is that Tk is assuming a defau

相关标签:
3条回答
  • 2021-01-19 12:33
    import tkinter
    
    master = tkinter.Tk()
    
    tkinter.Button(master, text='ONE                ').grid(row=0, column=3, sticky='NW')
    tkinter.Button(master, text='TWO               ').grid(row=1, column=3, sticky='NW')
    tkinter.Button(master, text='THR                ').grid(row=2, column=3, sticky='NW')
    tkinter.Button(master, text='FOU                ').grid(row=3, column=3, sticky='NW')
    tkinter.Text(master).grid(column=30, columnspan=10)
    
    0 讨论(0)
  • 2021-01-19 12:46

    old post I know, but I also struggled to get the columns and rows to maintain a common width/height so I thought I would share my solution

    newish to python and tkinter, so if there are any mistakes please let me know

    I created a grid manager, this allowed the main window and any frame to be setup with evenly spaced columns and rows, it's not 100% but for what I was using it for it worked well, it was especially useful during the building phase

    one downside when creating a frame is the maximum number of rows/columns of the frame must be equal to or less than the number or rows/columns it is spanning, otherwise it goes a bit weird (nut sure why)

    hope this helps

    import tkinter
    
    class grid_manager:
        def __init__(self, Frame, colour = "gray94"):
            self.Frame = Frame
            self.Colour = colour
    
        def set_grid(self, numofRows, numofColumns, borderwidth = 1):
            self.numofRows = numofRows
            self.numofColumns = numofColumns
            self.borderwidth = borderwidth
            for i in range(numofRows):
                for j in range(numofColumns):
                    canvas = tkinter.Canvas(self.Frame)
                    canvas.config(relief="raised", borderwidth=self.borderwidth)   #comment out to hide grid layout
                    canvas.grid(row=i, column=j)
                    canvas.config(background=self.Colour)
                    self.Frame.columnconfigure(j, weight=1)
                self.Frame.rowconfigure(i, weight=1)
    
    mainwindow = tkinter.Tk()
    
    mainwindow.title("Test")
    mainwindow.geometry("640x480-8-200")
    mainGrid = grid_manager(mainwindow)
    mainGrid.set_grid(10, 10)
    
    header_Frame = tkinter.Frame(mainwindow)
    header_Frame.grid(row=0, column=0, columnspan=10, sticky="nsew")
    headerGrid = grid_manager(header_Frame)
    headerGrid.set_grid(numofRows=1, numofColumns=10, borderwidth=5)
    
    footerFrame = tkinter.Frame(mainwindow)
    footerFrame.grid(row=9, column=0, columnspan=10, sticky="nsew")
    footerGrid = grid_manager(footerFrame, "red")
    footerGrid.set_grid(numofRows=1, numofColumns=10, borderwidth=5)
    
    rightFrame = tkinter.Frame(mainwindow)
    rightFrame.grid(row=1, column=5, rowspan=5, columnspan=5, sticky="nsew")
    rightGrid = grid_manager(rightFrame, "blue")
    rightGrid.set_grid(numofRows=5, numofColumns=5, borderwidth=2)
    
    leftFrame = tkinter.Frame(mainwindow)
    leftFrame.grid(row=3, column=0, rowspan=5, columnspan=4, sticky="nsew")
    leftGrid = grid_manager(leftFrame, "yellow")
    leftGrid.set_grid(numofRows=5, numofColumns=4, borderwidth=2)
    
    mainwindow.mainloop()
    

    enter image description here

    0 讨论(0)
  • 2021-01-19 12:49

    I think you might want to use the sticky option.

    sticky= Defines how to expand the widget if the resulting cell is larger than the widget itself. This can be any combination of the constants S, N, E, and W, or NW, NE, SW, and SE.

    For example, W (west) means that the widget should be aligned to the left cell border. W+E means that the widget should be stretched horizontally to fill the whole cell. W+E+N+S means that the widget should be expanded in both directions. Default is to center the widget in the cell.

    import Tkinter
    
    master = Tkinter.Tk()
    
    Tkinter.Button(master, text='ONE').grid(row=0, column=0, sticky='NW')
    Tkinter.Button(master, text='TWO').grid(row=0, column=1, sticky='NW')
    Tkinter.Button(master, text='THR').grid(row=0, column=2, sticky='NW')
    Tkinter.Button(master, text='FOU').grid(row=1, column=2)
    Tkinter.Text(master).grid(row=1, column=0, columnspan=2)
    
    
    master.mainloop()
    

    Edit

    What does it look like. Mine looks like this evenly spaced except the text widget takes up two columns as specified.

    Does it look like this

    0 讨论(0)
提交回复
热议问题