The default behavior of using the grid geometry manager is that columns will be as small as possible, so you don't need to do anything (assuming you're using grid properly).
The behavior you describe where there is too much space between the elements is probably due to the fact you have other widgets in that same column which are wider. The column will default to the smallest width that will accomodate the widest item. That, or elsewhere in your code you give a non-zero weight to some of those columns that is causing them to expand.
Before I talk about a solution, let me make sure it's clear that the way you're using grid to put more than one widget in the same cell is definitely the wrong way to do it. There's absolutely no reason to resort to such a solution. A general rule of thumb is that you should never put more than one widget in a cell.
The simplest solution for you is to combine grid and pack. Put all of your checkbuttons in a frame and pack them on the left side of that frame. Then, put the frame in your grid with sticky="w"
. Then, no matter how big the window gets, the checkbuttons will always be stuck to the left side of their containing frame.
Note that this solution doesn't break the rule of thumb I mentioned earlier. You're only putting one widget in a cell: the frame. You can put whatever you want in that inner frame, but from the perspective of the grid there is only a single widget in each cell of the grid.
Here is a working example base on python 2.7:
import Tkinter as tk
class ExampleView(tk.Frame):
def __init__(self, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
cbframe = tk.Frame(self)
cb1 = tk.Checkbutton(cbframe, text="Choice 1")
cb2 = tk.Checkbutton(cbframe, text="Choice 2")
cb3 = tk.Checkbutton(cbframe, text="Choice 3")
cb1.pack(side="left", fill=None, expand=False)
cb2.pack(side="left", fill=None, expand=False)
cb3.pack(side="left", fill=None, expand=False)
# this entry is for illustrative purposes: it
# will force column 2 to be widget than a checkbutton
e1 = tk.Entry(self, width=20)
e1.grid(row=1, column=1, sticky="ew")
# place our frame of checkbuttons in the same column
# as the entry widget. Because the checkbuttons are
# packed in a frame, they will always be "stuck"
# to the left side of the cell.
cbframe.grid(row=2, column=1, sticky="w")
# let column 1 expand and contract with the
# window, so you can see that the column grows
# with the window, but that the checkbuttons
# stay stuck to the left
self.grid_columnconfigure(1, weight=1)
if __name__ == "__main__":
root = tk.Tk()
view = ExampleView(root)
view.pack(side="top", fill="both", expand=True)
root.wm_geometry("400x200")
root.mainloop()
Of course, you can also place the checkbuttons in separate columns -- which is often easiest -- but you might need to have other items in other rows span multiple columns and deal with column weights. Since it's not clear exactly what your problem is based on your description, the above solution is probably the simplest for you.