2012-11-11 39 views
2

我正在使用行来布局我的Tkinter程序。 我通常使用包装,所以我的按钮会自动放置自己,而不是重叠,使用行,我的按钮重叠,我必须通过更改它们的padx值来对齐它们。我想知道是否有更简单的方法来做到这一点。如何排列Tkinter上的按钮

from sys import argv 
from Tkinter import * 
from PIL import Image, ImageTk, ImageFilter 
import random 

script, infile = argv 

class MyApp(object): 
    def __init__(self): 
     self.root = Tk() 
     self.root.wm_title("ImagePro") 



     #Original 
     original = Image.open(infile) 
     (w, h) = (original.size[0], original.size[1]) 
     tkpi = ImageTk.PhotoImage(original) 
     label = Label(self.root, image=tkpi) 
     label.grid(row =0, column=0, padx=5,pady=5) 

     img = original.copy().convert("L") 
     tkpi2 = ImageTk.PhotoImage(img) 
     label = Label(self.root, image=tkpi2) 
     label.grid(row =0, column=1, padx=5,pady=5) 

     Label(self.root, text = "Original").grid(row=1, column=0) 
     Label(self.root, text = "Modified").grid(row=1, column=1) 
     Button(self.root, text = "Brighten").grid(row=2, column=0, sticky=W) 
     Button(self.root, text = "Darken").grid(row=2, column=0, sticky=W, padx=60) 
     Button(self.root, text = "Warm").grid(row=2, column=0, sticky=W, padx=112) 
     Button(self.root, text = "Cool").grid(row=2, column=0, sticky=W, padx=158) 








     self.root.mainloop() 




MyApp() 

回答

5

要做到这一点,你需要开始使用框架。框架充当小部件的容器。将所有按钮添加到框架,然后将该框架添加到根容器。

class MyApp(object): 
    def __init__(self): 
     self.root = Tk() 
     self.root.wm_title("ImagePro") 

     #Original 
     original = Image.open(infile) 
     (w, h) = (original.size[0], original.size[1]) 
     tkpi = ImageTk.PhotoImage(original) 
     label = Label(self.root, image=tkpi) 
     label.grid(row =0, column=0, padx=5,pady=5) 

     img = original.copy().convert("L") 
     tkpi2 = ImageTk.PhotoImage(img) 
     label = Label(self.root, image=tkpi2) 
     label.grid(row =0, column=1, padx=5,pady=5) 

     Label(self.root, text = "Original").grid(row=1, column=0) 
     Label(self.root, text = "Modified").grid(row=1, column=1) 

     self.buttonframe = Frame(self.root) 
     self.buttonframe.grid(row=2, column=0, columnspan=2)   
     Button(self.buttonframe, text = "Brighten").grid(row=0, column=0) 
     Button(self.buttonframe, text = "Darken").grid(row=0, column=1) 
     Button(self.buttonframe, text = "Warm").grid(row=0, column=2) 
     Button(self.buttonframe, text = "Cool").grid(row=0, column=3) 

     self.root.mainloop() 

每个按钮都在框架内的自己的列中,框架位于主容器的底部。

+0

使用'grid'的好处是避免那些中间额外帧。 – FabienAndre

0

如果您使用相同的row,column对几个小部件,它们将出现在网格的同一个单元格中。因此,像这样的事情应该做的伎俩。

Button(self.root, text = "Brighten").grid(row=2, column=0) 
Button(self.root, text = "Darken").grid(row=2, column=1) 
Button(self.root, text = "Warm").grid(row=2, column=2) 
Button(self.root, text = "Cool").grid(row=2, column=3) 

你会发现grid几何管理器的本文档的详细信息http://effbot.org/tkinterbook/grid.htm

+0

这当然有用,但最上面一排有大图像。如果按钮与图像放在同一列,则它们将不均匀地展开。至少应该为此使用一个额外的框架。 – Tim

+0

对此的常见答案是跨越多个列/行跨越大型小部件。 – FabienAndre