2017-02-04 52 views
0

我正在Python 2.7 Tkinter中设计一个简单的GUI,但我无法将事物展开,因为我想要它们。我已经设法将我的各种小部件粗略地放在我想要的地方,但是我似乎无法强制将它们分开,并且事情有点聚在一起。小部件和LablelFrames的Python Tkinter网格间距不正确

我也试图画出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() 

我已经尝试了各种改动,但不能钉它!任何帮助将非常感激。

+0

你想要什么,当你调整窗口的大小会发生什么?顶部框架应占用所有额外空间吗?所有的框架是否应该平等占用额外的空间?应该没有框架占用任何额外的空间? –

回答

1

首先,列/行适应那里的内容,所以空的一个作为零高度/宽度。如果您想在您的小部件之间放置空间,请使用.grid方法中的padxpady选项。他们可以选择一个数字,这样可以在两侧填充填充物,也可以使用两边数字填充填充物。其次,如果您希望您的小部件位于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() 
+0

非常感谢你。我已经调整了这个策略到我的图形用户界面,经过一些调整后,它的工作非常好。 – JamesPy

+0

您的解决方案不会随窗口调整大小。 –