小部件和LablelFrames的Python Tkinter网格间距不对

时间:2017-02-04 17:06:56

标签: python python-2.7 user-interface tkinter

我正在Python 2.7 Tkinter中设计一个简单的GUI,但是我无法按照我想要的那样展开。我已经设法将我的各种小部件大致放在我想要的地方,但是我似乎无法强制间隔,事情有点揉成一团。

我还尝试绘制3个LabelFrame来将窗口分开,但小部件似乎落在了LabelFrame上。我想知道如何把它更好地解决这个问题。就我所见,网格系统似乎允许事物聚集并忽略空行和列。

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

我尝试了各种改动,但不能指甲!任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

首先,列/行适应那里的内容,所以空的一个作为零高度/宽度。如果您想在小部件之间添加空格,请使用padx方法中的pady.grid选项。他们可以使用一个数字,这个数字可以在两侧给出填充,或者两个数字给出每边的填充。

其次,如果您希望您的小部件位于LabelFrame中,则需要使用此LabelFrame作为主窗口而不是主窗口创建它们。

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