在前几个程序中, 我们花了大量的时间来讨论事件处理器与控件的绑定.
本程序中, 我们回到构建GUI界面上来 -- 配置控件外观和布局.
*三种界面布局方式*
有三种方法用来配置界面布局.
* 控件属性
* pack()
* 容器嵌套
在本程序中, 我们主要通过设置控件属性和调用pack()来配置外观.
我们将在一个容器里放置很多的按钮. 早期的程序中, 我们把这个容器叫"myContainer1". 在这里我们给了它一个更形象的名字: "buttons_frame".
下面大量的内容都是对源码的一些解释.
(1)
首先, 我们用"width"属性来使所有的按钮拥有同样的宽度. 注意这里说的是Tkinter中的按钮控件的宽度属性 -- 并不是所有的控件都有这个属性的. 还要注意宽度的单位是字符(而不是像素, 英寸, 毫米之类). 因为我们最长的文本("Cancel")有6个字符, 所以我们就将宽度设为"6". (1)
(2)
现在我们来设置按钮的填充区域. 填充区域是指导文本到按钮边缘的这部分区域. 我们通过"padx"和"pady"来设置它. "padx"用于设置沿X轴, 水平方向的填充. "pady"用于设置沿Y轴, 竖起方向的填充.
我们将水平填充区域设为3毫米宽(padx="3m"), 竖直填充区域为1毫米高(pady="1m"). 注意不像前面设置宽度时那样(那里直接用数字), 这些值需要用引号括起来. 因为我们在这儿用"m"指定了所用的单位, 所以我们不能用数字而是用字符串来指定这些值.
(3)
最后, 我们设置容器(buttons_frame)与按钮之间的填充区域. 对于容器来说, 它有四个填充属性. "padx"和"pady"用于设置容器与外界的填充区域. "ipadx"和"ipady"用于设置容器与内部控件的填充区域.
注意我们在指定容器的填充值时, 即可以通过属性来设置, 也可以通过传入pack方法来设置. (4). 正如你所看到的, 填充确实比较麻烦. 容器有内部的填充, 但控件却没有. 有时控件的填充是通过属性来设置, 有时也通过pack来设置.
*代码示例*
运行程序会有两个按钮, 而且它们一般大. 按钮边缘与文本之间也不是完全贴在一起. 所有的按钮还有一个漂亮的外边框.
- from Tkinter import *
-
-
class MyApp:
-
def __init__(self, parent):
-
-
#------ constants for controlling layout ------
-
button_width = 6 ### (1)
-
-
button_padx = "2m" ### (2)
-
button_pady = "1m" ### (2)
-
-
buttons_frame_padx = "3m" ### (3)
-
buttons_frame_pady = "2m" ### (3)
-
buttons_frame_ipadx = "3m" ### (3)
-
buttons_frame_ipady = "1m" ### (3)
-
# -------------- end constants ----------------
-
-
self.myParent = parent
-
self.buttons_frame = Frame(parent)
-
-
self.buttons_frame.pack( ### (4)
-
ipadx=buttons_frame_ipadx, ### (3)
-
ipady=buttons_frame_ipady, ### (3)
-
padx=buttons_frame_padx, ### (3)
-
pady=buttons_frame_pady, ### (3)
-
)
-
-
-
self.button1 = Button(self.buttons_frame, command=self.button1Click)
-
self.button1.configure(text="OK", background= "green")
-
self.button1.focus_force()
-
self.button1.configure(
-
width=button_width, ### (1)
-
padx=button_padx, ### (2)
-
pady=button_pady ### (2)
-
)
-
-
self.button1.pack(side=LEFT)
-
self.button1.bind("", self.button1Click_a)
-
-
self.button2 = Button(self.buttons_frame, command=self.button2Click)
-
self.button2.configure(text="Cancel", background="red")
-
self.button2.configure(
-
width=button_width, ### (1)
-
padx=button_padx, ### (2)
-
pady=button_pady ### (2)
-
)
-
-
self.button2.pack(side=RIGHT)
-
self.button2.bind("", self.button2Click_a)
-
-
def button1Click(self):
-
if self.button1["background"] == "green":
-
self.button1["background"] = "yellow"
-
else:
-
self.button1["background"] = "green"
-
-
def button2Click(self):
-
self.myParent.destroy()
-
-
def button1Click_a(self, event):
-
self.button1Click()
-
-
def button2Click_a(self, event):
-
self.button2Click()
-
-
-
-
root = Tk()
-
myapp = MyApp(root)
-
root.mainloop()
阅读(943) | 评论(0) | 转发(0) |