Chinaunix首页 | 论坛 | 博客
  • 博客访问: 72559
  • 博文数量: 26
  • 博客积分: 628
  • 博客等级: 中士
  • 技术积分: 315
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-22 11:57
文章分类

全部博文(26)

文章存档

2012年(4)

2011年(19)

2010年(3)

我的朋友

分类: Python/Ruby

2011-04-29 11:10:05

在前几个程序中, 我们花了大量的时间来讨论事件处理器与控件的绑定.

本程序中, 我们回到构建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来设置.

*代码示例*

运行程序会有两个按钮, 而且它们一般大. 按钮边缘与文本之间也不是完全贴在一起. 所有的按钮还有一个漂亮的外边框.

  1. from Tkinter import *

  2. class MyApp:
  3.     def __init__(self, parent):
  4.         
  5.         #------ constants for controlling layout ------
  6.         button_width = 6 ### (1)
  7.         
  8.         button_padx = "2m" ### (2)
  9.         button_pady = "1m" ### (2)

  10.         buttons_frame_padx = "3m" ### (3)
  11.         buttons_frame_pady = "2m" ### (3)        
  12.         buttons_frame_ipadx = "3m" ### (3)
  13.         buttons_frame_ipady = "1m" ### (3)
  14.         # -------------- end constants ----------------
  15.         
  16.         self.myParent = parent
  17.         self.buttons_frame = Frame(parent)
  18.         
  19.         self.buttons_frame.pack( ### (4)
  20.             ipadx=buttons_frame_ipadx, ### (3)
  21.             ipady=buttons_frame_ipady, ### (3)
  22.             padx=buttons_frame_padx, ### (3)
  23.             pady=buttons_frame_pady, ### (3)
  24.             )
  25.         
  26.     
  27.         self.button1 = Button(self.buttons_frame, command=self.button1Click)
  28.         self.button1.configure(text="OK", background= "green")
  29.         self.button1.focus_force()
  30.         self.button1.configure(
  31.             width=button_width, ### (1)
  32.             padx=button_padx, ### (2)
  33.             pady=button_pady ### (2)
  34.             )

  35.         self.button1.pack(side=LEFT)    
  36.         self.button1.bind("", self.button1Click_a)
  37.         
  38.         self.button2 = Button(self.buttons_frame, command=self.button2Click)
  39.         self.button2.configure(text="Cancel", background="red")
  40.         self.button2.configure(
  41.             width=button_width, ### (1)
  42.             padx=button_padx, ### (2)
  43.             pady=button_pady ### (2)
  44.             )
  45.     
  46.         self.button2.pack(side=RIGHT)
  47.         self.button2.bind("", self.button2Click_a)
  48.         
  49.     def button1Click(self):
  50.         if self.button1["background"] == "green":
  51.             self.button1["background"] = "yellow"
  52.         else:
  53.             self.button1["background"] = "green"
  54.     
  55.     def button2Click(self):
  56.         self.myParent.destroy()
  57.         
  58.     def button1Click_a(self, event):
  59.         self.button1Click()
  60.                 
  61.     def button2Click_a(self, event):
  62.         self.button2Click()
  63.   
  64.     
  65.             
  66. root = Tk()
  67. myapp = MyApp(root)
  68. root.mainloop()
阅读(953) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~