简体   繁体   中英

Python Tkinter grid spacing of widgets and LablelFrames not right

I am designing a simple GUI in Python 2.7 Tkinter, but I can't get things to spread out as I want them. I have managed to get my various widgets roughly where I want them, however I can't seem to force spacing out and things are a little bunched up.

I have also tried to draw 3 LabelFrames to separate the window out, but widgets seem to fall over the LabelFrames. I am wondering how I can space this out a little better. The grid system seems to allow things to bunch up and ignores blank rows and columns as far as I can see.

from Tkinter import * 
import Tkinter, Tkconstants, tkFileDialog, tkMessageBox

class FileZap():
    def __init__(self, root):


        root.title("TestGUI")
        root.geometry("860x450")    

        self.topFrame = LabelFrame(root, text="Top Area")
        self.topFrame.grid(row=1, column=1, rowspan=6, columnspan=7, padx=5, pady = 5, sticky="NSEW")

        self.listbox1 = Listbox(root, width=50, selectmode="multiple")
        self.listbox1.grid(row=3, column=2)
        self.scrollbar = Scrollbar(orient=VERTICAL, command=self.listbox1.yview)
        self.listbox1.config(yscrollcommand=self.scrollbar.set)
        self.scrollbar.grid(row=3, column=3, sticky="ns")
        self.listbox2 = Listbox(root, width=50)
        self.listbox2.grid(row=3, column=4)
        self.selectLabel = Label(root, text="Select a folder: ")
        self.selectLabel.grid(row=3, column=1)
        self.user1 = Entry(root, width="50")
        self.user1.grid(row=2, column=2)
        self.browse = Button(root, text="Browse")
        self.browse.grid(row=2, column=3)
        self.addItems = Button(root, text="Add to Selection")
        self.addItems.grid(row=4, column=2)
        self.clearItems = Button(root, text="Clear Selection")
        self.clearItems.grid(row=4, column=4)

        self.leftFrame = LabelFrame(root, text="Left Area")
        self.leftFrame.grid(row=5, column=1, rowspan=6, columnspan=3, padx=5, pady = 5, sticky="NSEW")

        self.replaceInLable = Label(root, text="String to replace: ")
        self.replaceOutLable = Label(root, text="New string: ")
        self.replaceInLable.grid(row=7, column=1)
        self.replaceOutLable.grid(row=7, column=2)
        self.replaceIn = Entry(root, width="20")
        self.replaceOut = Entry(root, width="20")
        self.replaceIn.grid(row=8, column=1)
        self.replaceOut.grid(row=8, column=2)
        self.replace = Button(root, text="Replace")
        self.replace.grid(row=8,column=3)

        self.rightFrame = LabelFrame(root, text="Right Area")
        self.rightFrame.grid(row=5, column=4, rowspan=6, columnspan=3, padx=5, pady = 5, sticky="NSEW")

        self.quit = Button(root, text="Exit", command=root.quit)
        self.quit.grid(row=9, column=6)

root = Tkinter.Tk()
file_zap = FileZap(root)
root.mainloop()

I have tried various alterations but can't nail it! Any help would be much appreciated.

First, the columns / row adapt to there content so an empty one as a zero height/width. If you want to put space between your widgets use the padx and pady options in the .grid method. They can take either one number which will give the padding on both sides or a couple of numbers giving the padding on each side.

Secondly, if you want your widgets to be inside a LabelFrame, you need to create them with this LabelFrame as master instead of the main window.

from Tkinter import LabelFrame, Tk, Button, Label

root = Tk()
# make row 0 resize with the window
root.rowconfigure(0, weight=1)
# make column 0 and 1 resize with the window
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)
# create LabelFrames
top_frame = LabelFrame(root, text="top")
left_frame = LabelFrame(root, text="left")
right_frame = LabelFrame(root, text="right")

top_frame.grid(row=0, column=0, columnspan=2, padx=10, pady=(10,4), sticky="nsew")
left_frame.grid(row=1, column=0, padx=(10,4), pady=4, sticky="nsew")
right_frame.grid(row=1, column=1, padx=(4,10), pady=4, sticky="nsew")

#create widgets inside top_frame
Label(top_frame, text="I'm inside top_frame").pack()
Button(top_frame, text="Top").pack()
#create widgets inside left_frame
Label(left_frame, text="I'm inside left_frame").pack()
Button(left_frame, text="Left").pack()
#create widgets inside top_frame
Label(right_frame, text="I'm inside right_frame").pack()
Button(right_frame, text="Right").pack()

Button(root, text="Quit", command=root.destroy).grid(row=2, column=0, 
                                                     columnspan=2, pady=10)

root.mainloop()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM