Python GUI之tkinter

更新时间:2023-07-14 07:46:49 阅读: 评论:0

Tkinter教程系列前言 (2007-10-04 21:45)
      这系列教程完全以代码的形式来写的,目标是:读者看代码和注释就可以理解 代码的意思。
但这里的读者需要具备的几项技能:

1 熟悉python语言的基础,如果还没有,先看一下python的教程吧,英文官方(docs.python/tut/tut.html);
2 对界面编程有一定的了解,知道基本的概念就可以了;
3 Tk有兴趣,别以为她是已经过时的技术,如果丧失了学习的兴趣,那肯定无法完成了;
4 不要以Ctrl+C/Ctrl+V的方式使用本教程(虽然它可以这样直接运行),自己输入,你会发现自己原来也会犯这样的错误;
5 安装了python2.5且确认安装了Tkinter模块(默认就安装了,如果你没有强制的把它去掉的话),下载python2.5www.python/download/);
6 如果在阅读教程中有不明白的,不要强迫自己,直接跳过去,继续下一个内容。
Tkinter教程系列教程的特点:
7 他不是一本经过文字润色的文章,全部是代码,作者在必要的时候使用注释来解释;
8 以组件为章节进行介绍,每个组件又分为不同的例子,各个例子可以单独使用,分别使用序号标注;
9 各个例子的使用注释+序号的格式表示开始,下一个例子的开始为上一个例子的结束;
10 全部使用结构化编程(SP),没有面向对象的概念(OO)
11 基本上包含了TKinter的所有的控件,根据每个控件的使用方法,选择性的介绍了其属性和方法,没有全部介绍,全部的介绍查看Tkinter的官方参考(/library/tkinter/introduction/)
12 例子不是百分百的完美,甚至有的例子没有按照Tkinter参考的描述完成,原因由于作者没有看懂:(
13 参考书籍:/library/tkinter/introduction/,如有冲突以Tkinter参考为准
最后祝各位Tk一路快乐!

Python中的"copy"与"reference" (2007-09-22 20:08)
'''
Python中的copy”与reference
每个对象对应一个实体,一个实体可以对应多个别名,python没有像C++语言的参数和引用的之分,python统一使用别名(alia)
对于简单(或者称为基本)和不可修改类型,python使用copy”别名的方式;对于复合和可修改类型,python使用reference”别名
1.使用copy”别名,必须使用基本类型(intfloatstringtuple
'''
# 整型数值
x = 10
y = x
print x,y
# 10,10

y = 40
print x,y
# 1040
# x的值还为10y的值变为40
'''
y = x是对象复制,xy分别使用不同的对象实体,故y只改变后,x值还为10
'''

'''
2.使用reference”别名,类型为自定义一个Point
'''
#定义一个Point
class Point:
    pass;
       

a = Point()
a.x = 10

# 给对象Point再加一个别名
b = a
# 打印原始数据
print a.x,b.x

# 使用别名b访问Point对象
b.x = 40

# 打印修改后的Point对象
print a.x,b.x
'''
b = aPoint对象实体添加另外的一个别名,当再次调用b.x = 40时,b指向的实体改变,其x属性重新赋值为40.xy指向同一个实体,
a的属性x也改为40
'''

Python面向对象初级教程 (2007-09-23 02:38)

'''
    python不单单用作结构化编程,她还是面向对象的高级语言,支持类(class),本文将介绍Python面向对象的编程思想。类(class)被用来用户自定义数据类型,用户使用类(class)来组织数据,管理数据。
    (class)的定义
    (class)的属性(attribute)
    (class)的方法(method)
    (chalss)成员的控制域
    (class)的继承与组合
1.类的定义,类的定义使用关键字class,后跟类的名称,及":"。如定义一个Point
'''
# 定义一个空的类,没有任何属性与方法
class Point:
    pass
'''
向类中添加类属性(有的称之为类成员),类属性与其它的变量使用方法一致,第一次使用便是对此变量的定义,属性的作用域为整个类,即这个类的所有方法可以访问此属性,定义Point属性的属性xy
'''
# 定义一个空的类,没有任何属性与方法
class Point:
    # 定义xy坐标
    x = 10
    y = 10

'''
类方法为特殊的函数,其定义方法与函数类似,但有一个默认的参数lf,表示此类对象的实例(instance),定义类的方法,设置x的方法tX和获取x的方法getX
'''
# 定义一个完整的类,包含属性与方法
class Point:
    # 定义xy坐标
    x = 10
    y 爆肚满= 10
    def tX(lf,x_):
        lf.x = x_
    def getX(lf):
        return lf.x
    def tY(lf,y_):
        lf.y = y_
    def getY(lf):
        return lf.y
    def tXY(lf,x_,y_):
        lf.tX(x_)
        lf.tY(y_)
'''
注意:这个类方法如何访问类属性,使用lf.x,而不是xpython类方法与C++不同,类的成员方法不会自动使用类的属性,必须使用lf明确指定。如果只使用x,则在tX函数中创建了一个变量x,并将其值设置为_x
    同样对于类方法之间互相访问时也必须使用lf指定为调用的为类的方法。
'''
# python还支持在类定义块之外定义方法,这个方法满足类方法,例如先定义一个函数outX
def out_tX(lf,x_):
    lf.x = x_
# 然后定义类,并将类成员h赋值为out_tX
class Point:
    x = 10
    y = 10
    tX = out_tX
'''
创建一个类的对象,并访问这个类的属性和方法
'''
# 创建Point的一个对象
pt = Point()
# 设置坐标x的值
pt.x = 10
# 获取坐标x的值
print pt.x
# 访问对象的方法
pt.tX(20)

'''
    C++中有函数重载的概念,python鲁迅时代背景则没有,如果有如下函数定义
def f():
    print 'f'
def f(x):
    print 'f(x)'
f()
f(20)

出错信息
TypeError: f() takes exactly 1 argument (0 given)
由于f先定义为无参数的函数,后有定义为带一个参数的函数,及f被重新定义,所以再次调用
f()时,解释器抱怨找不到无参数名称为f的函数。但可以使用如下
def f():
    print 'f'
def f(x):
    print 'f(x)'
#id已被重新定义,可以这样解释:
##    x = 10
## x = 20
#此时x的值已经被改编为20,已不再是10无法在访问10
#f()
f(20)
'''
'''
    C++还有构造函数(constructor)的概念,这个函数为一特殊的函数,在创建对象时自动被调用,python中也没有构造函数,有一个功能类似的函数,用来初始化类属性,这个函数为:
__init__,如下代码,在创建对象时将类属性初始化
'''
class Point:
    x = 10
    y = 10
    def __init__(lf,x_,y_):
        lf.x = x_
        lf.y = y_

# 将坐标(x,y)设置为(20,20)       
pt = Point(20,20)
print pt.x,pt.y

'''
类的成员(属性和方法)python默认使用public,即属性与方法可以被直接访问,这一点与C++也不相同,python改变属性可见性的是通过表示ID,私有成员以"前导字符_至少两个,后尾字符_最多一个"表示,如定义私有属性和私有方法
私有属性:
    __pri1        前导字符个数2
    ___pri2        前导字符个数3
    ____pri3_    前导字符个数4,后尾字符1
共有属性:
    _pub1        前导字符1
    ___pri2__    前导字符3,后尾字符2
'''
class Point:
    # 私有属性,只能通过类方法访问
    __x = 10
    # 私有方法,可被其他类方法调用
    def __tX(lf,x_):
        # 访问私有属性
        lf.__x = x_
    def tX(lf,x_):
        # 调用私有方法
        lf.__tX(x_)
    def getX(lf):
        # 访问私有属性
        return lf.__x
pt = Point()
# 直接访问__x
# pt.__x
# 解释器会抱怨没有__x属性
# AttributeError: Point instance has no attribute '__x'
# 访问私有方法
# pt.__tX(10)
# 解释器还是会抱怨没有属性__tX(python视方法也为属性)
print pt.getX()
pt.tX(20)
print pt.getX()

'''
在类中可以定义属性,有此类创建的对象可以使用此类的所有属性,除此之外,python还支持动态向类或类对象中添加属性。向类中添加属性,其后所有的类对象便可以使用新添加的属性;若向类对象中添加属性,只用此类对象可以使用此属性
'''
'''向类中添加属性'''
class Point:pass

# 向类中添加属性z
Point.z = 30
# 创建类对象
pt = Point()
pp = Point()
# 访问类属性z
print Point.z
# 访问类对象属性z,pppt均含有属性z
print pt.z,pp.z

'''向类对象中添加属性'''
class Point:pass

pt = Point()
pp = Point()
# 向类对象中添加属性
pt.z = 10

# 访问类的属性
# print Point.z
# 解释器抱怨没有属性z
#AttributeError: class Point has no attribute 'z'
print pt.z

# 访问pp对象的属性z
# print pp.z
#解释器抱怨没有z属性
#AttributeError: Point instance has no attribute 'z'

'''
类的继承与组合,实现代码重用。不用copy&paste代码,当创建新类时,不必全部从头开始,尽可能的使用已有代码。TIC++中使用两种方法:一种称为组合(composition);另一种称为继承(inheritance)
继承语法格式:
class class DerivedClassName(BaClassName):pass
'''
'''子类访问父类属性'''
class Point:
    x = 10
    y = 20
    def tX(lf,x_):
        lf.x = x_
    def getX(lf):
        return lf.x
   
class Circle(Point):
    r = 5
# 创建父类对象
pt = Point()
# 创建子类对象
cl = Circle()
# 访问父类的属性
print cl.x,cl.y
# 访问父类的方法
cl.tX(40)
print cl.x,cl.y

'''重载父类属性,访问Circle属性'''
class Point:
    x = 10
    y = 20
    def tX(lf,x_):
        lf.x = x_
    def getX(lf):
        return lf.x
   
class Circle(Point):
    x = 40
    y = 50
    r = 5
# 创建父类对象
pt = Point()
# 创建子类对象
cl = Circle()
# 访问Circle类的属性
print cl.x,cl.y
# 40,50

'''重载父类属性,访问父类Point属性'''
class Point:
    x = 10
    y = 20
    def tX(lf,x_):
        lf.x = x_
    def getX(lf):
        return lf.x
   
class Circle(Point):
    x = 40
    y = 50
    r = 5
    # 访问父类的属性
    def callBa(lf):
        # x,y已经被Circle重载,显示使用父类访问父类属性
        print Point.x,Point.y
# 创建子类对象
cl = Circle()
# 访问Point类的属性
cl.callBa()
# 10,20

'''
C++语言中的子类会自动调用父类的构造函数,python中的__init__不会自动调用父类的__init__,如果要调用必须显示的调用父类的__init__
'''
'''重载父类属性,访问父类属性'''
class Point:
    def __init__(lf):
        print 'Point'
   
class Circle(Point):
    def __init__(lf):
        # 显示调用父类的__init__函数
        Point.__init__(lf)
        print 'Circle'
cl = Circle()
# Point
# Circle
'''
C++有抽象类,此类只定义函数接口(有的称之为interface),其具体的实现有子类来实现,python没有抽象类,实现方法:将基类函数接口设置为None团队精神正能量的句子,如果使用此基类创建对象,调用此函数时会出现异常,具体实现由其子类实现
'''
#抽象类
class Graphic:
    draw = None
# 实现Graphicdraw
class Point(Graphic):
    x = 10
    y = 10
    # draw赋值
    def __init__(lf):
        lf.draw = lf.__draw
    # 实现抽象接口
    def __draw(lf):
        print lf.x,lf.y
# 实现Graphicdraw
class Circle(Point):
    r = 5
    # draw赋值
    def __init__(lf):
        lf.draw = lf.__draw
    # 实现抽象接口
    def __draw(lf):
        print lf.x,lf.y,lf.r
# 创建各个类的对象
gp = Graphic()
pt = Point()
cl = Circle()
#gp.各种笑的描写draw()
# 函数调用出错
#TypeError: 'NoneType' object is not callable
# 调用Pointdraw
pt.draw()
# 调用Circledraw
cl.draw()

'''
类的组合:类的另一种重用方式,《C++ Primer plus》有介绍适用于此设计方法的类与类之间的关系,称之为has-a“关系,与继承is-a“关系相对应。
is-a“关系:
圆柱(cylinder)is-a特殊的圆(circle),它含有高度属性,圆(circle)为圆柱(cylinder)的父类;
(circle)is-a特殊的点,它含有半径属性,(point)为圆(circle)的父类
'''
# 定义父类及子类
class Point:pass
class Circle(Point):pass
class Cylinder(Circle):pass

'''
has-a"关系:
画布(canvas)上可以绘制各种图形(如:点(point)、圆(circle)和圆柱(cylinder))。绘图程序
定义如下关系
'''
# 定义容器类
class Canvas:
    # 包含三个类对象PointCircleCylinder
    pt = Point()
    cl = Circle()
    cy = Cylinder()
    def __init__(lf):
        pass

Tkinter教程之Label篇 (2007-09-28 00:26)
#Tkinter教程之Label
'''1.Label的第一个例子
text属性使用方法
'''
#要使用Tk模块,除非你不想使用这个模块,那整个教程就不需要看了
from Tkinter import *
#初始化Tk
root = Tk()
#创建一个label,使用编码,到现在为止还没有使用过直接通过drag-and-drop”就可以完成的IDE
label = Label(root,text = 'Hello Tkinter')
#显示label,必须含有此语句
label.pack()
#root.pack()
#root是不需要(严格地说是必须不这样使用),否则解释器抱怨
#进入消息循环
root.mainloop()
#控件的显示步骤:
#1.创建这个控件
#2.指定这个空间的master,即这个控件属于哪一个
#3.告诉GM(geometry manager)有一个控件产生了
'''
还有更简单的一个例子:将‘Hello Tkinter’打印到标题上,Label也不用创建了
from Tkinter import *
root = Tk()
root.title('hello Tkinter')
root.mainloop()
再没法儿简化了,就这样吧
'''
'''2.label上使用内置位图
bitmap的使用方法
'''
from Tkinter import *
#初始化Tk
root = Tk()
#创建一个label,使用编码,到现在为止还没有使用过直接通过drag-and-drop”就可以完成的IDE
label = Label(root,bitmap = 'error')
#上面的代码使用了内置位图error

#显示label,必须含有此语句
label.pack()

#进入消息循环
root.mainloop()
'''
其他可用的位图:
    * error
    * hourglass
    * info
    * questhead
    * question
    * warning
    * gray12
    * gray25
    * gray50
    * gray75
若要查看各自的效果,可以使用相应的名称将bitmpa = 'error'替换。
据说还可以使用自己指定的位图文件,网上找了一下,格式如下:
    Label(root, bitmap="@/path/bitmapname")
不过我试了一下,从来没有成功过,我已经将位图该为单色的了:(

另:还有的网上的文章说明如何使用PhotoImageBitmapImage显示bmpgif文件,提到一点
防止图像文件被python自动回收(garbage collected),应将bmpgif放到全局(global)或实体
(instance)中,使用如下两种方法,仍未奏效:
'''
#使用image属性
#    bm = PhotoImage(file = 'c:\\python.gif')
#    label = Label(root,image = bm)
#    label.bm = bm
#错误信息:
#TclError: image "pyimageXX" doesn't exist
#使用bitmap属性
#    bm = BitmapImage(file='c:\\python2.bmp')
#    label = Label(root,bitmap=bm)
#    label.bm = bm
#    label.pack()
#错误信息:
#TclError: format error in bitmap data
'''
虽然二者均没有起作用,还是要说明一下,bitmapimage的关系,如果同时指定这两参数,image
优先。
'''
'''3.改变控件的前景色和背景色
fg:前景色
bg:背景色
设置背景色的一个大的用处是:可以判断控件的大小(不同的控件使用不同的颜色,后续内容
可以使用此特性来调试container
'''
from Tkinter import *
root = Tk()
#在创建Label时指定各自使用的颜色
'''可以使用的颜色值:'''
#使用颜色名称
Label(root,fg = 'red',bg = 'blue',text = 'Hello I am Tkinter').pack()
#使用颜色值#RRGGBB
Label(root,fg = 'red',bg = '#FF00FF',text = 'Hello I am Tkinter').pack()
#使用系统相关的颜色值(Windows),不建议使用这样的值,不利于平台移植
Label(root,fg = 'red',bg = 'SystemButtonShadow',text = 'Hello I am Tkinter').pack()
root.mainloop()
'''
(1).使用颜色名称
Red
Green
Blue
Yellow
LightBlue
......
(2).使用#RRGGBB
label = Label(root,fg = 'red',bg = '#FF00FF',text = 'Hello I am Tkinter')
指定背景色为绯红色
(3).除此之外,Tk还支持与OS相关的颜色值,如Windows支持
SystemActiveBorder,
SystemActiveCaption,
SystemAppWorkspace,
SystemBackground,
......
'''
'''三别4.设置宽度与高度
width:    宽度
height:    高度
'''
from Tkinter import *
root = Tk()
#创建三个Label,分别显示red,blue,yellow
#注意三个Label的大小,它们均与文本的长度有关
Label(root,text = 'red',bg = 'red').pack()
Label(root,text = 'blue',bg = 'blue').pack()
Label(root,text = 'yellow',bg = 'yellow').pack()

#再创建三个Label,与上次不同的是这三个Label均使用widthheigth属性
#三个Label的大小由widthheight指定
Label(root,bg = 'red',width = 10,height = 3).pack()
Label(root,bg = 'blue',width = 10,height = 3).pack()
Label(root,bg = 'yellow',width = 10,height = 3).pack()
root.mainloop()
'''5.同时使用图像与文本
compound:    指定文本(text)与图像(bitmap/image)是如何在Label上显示,缺省为None
当指定image/bitmap时,文本(text)将被覆盖,只显示图像了。可以使用的值:
    left    图像居左
    right:    图像居右
    top    图像居上
    bottom:图像居下
    center:文字覆盖在图像上
bitmap/image:
    显示在Label上的图像
text:
    显示在Label上的文本
label = Label(root,text = 'Error',compound = 'left',bitmap = 'error')
'''
from Tkinter import *
root = Tk()
#演示compound的使用方法
#图像与文本在Label中的位置
#图像居下
Label(root,text = 'botton',compound = 'bottom',bitmap = 'error').pack()
#图像居上
Label(root,text = 'top',compound = 'top',bitmap = 'error').pack()
#图像居右
Label(root,text = 'right',compound = 'right',bitmap = 'error').pack()
#图像居左
Label(root,text = 'left',compound = 'left',bitmap = 'error').pack()
#文字覆盖在图像上
Label(root,text = 'center',compound = 'center',bitmap = 'error').pack()

#消息循环
root.mainloop()

'''6.文本的多行显示
Tk004中,使用widthheigth来指定控件的大小,如果指定的大小无法满足文本的要求是,会出现
什么现象呢?如下代码:
    Label(root,bg = 'welcome to jcodeer.cublog',width = 10,height = 3).pack()
运行程序,超出Label的那部分文本被截断了,常用的方法是:使用自动换行功能,及当文本长度大于
控件的宽度时,文本应该换到下一行显示,Tk不会自动处理,但提供了属性:
wraplength    指定多少单位后开始换行
justify:        指定多行的对齐方式
ahchor        指定文本(text)或图像(bitmap/image)Label中的显示位置
可用的值:
e
w
n
s
ne

sw
sn
center
布局如下图

                nw        n        ne
                w    center    e
                sw        s       
'''
from Tkinter import *
root = Tk()
#左对齐,文本居中
Label(root,text = 'welcome to jcodeer.cublog.cn',bg = 'yellow',width = 40,height = 3,wraplength = 80,justify = 'left').pack()
#居中对齐,文本居左
Label(root,text = 'welcome to jcodeer.cublog.cn',bg = 'red',width = 40,height = 3,wraplength = 80,anchor = 'w').pack()
#居中对齐,文本居右
Label(root,text = 'welcome to jcodeer.cublog.cn',bg = 'blue',width = 40,height = 3,wraplength = 80,anchor = 'e').pack()

root.mainloop()

'''
运行一下程序就可以直观的看出,justifyanchor的区别了:一个用于控制多行的对齐;另一个用于
控制整个文本块在Label中的位置
''

Tkinter教程之Button篇(1) (2007-09-29 00:16)
#JTkinter教程之Button(1)
#Button功能触发事件
'''1.一个简单的Button应用'''
from Tkinter import *
#定义Button的回调函数
def helloButton():
    print 'hello button'
root = Tk()
#通过command属性来指定Button的回调函数
Button(root,text = 'Hello Button',command = helloButton).pack()
root.mainloop()

'''
执行的结果:每次点击一次,程序向标准输出打印'hello button',以上为Button使用方法,可以
再做一下简化,如不设置Button的回调函数,这样也是允许的但这样的结果与Label没有什么太
大的区别,只是外观看起来有所不同罢了,失去了Button的作用。
from Tkinter import *
root = Tk()
#下面的relief = FLAT设置,就是一个Label了!!!
Button(root,text = 'hello button',relief=FLAT).pack()
root.mainloop()
'''
'''2.测试Buttonrelief属性'''
#运行下面的代码可以看到Button的各个不同效果,均没有回调函数。
from Tkinter import *
root = Tk()
#flat, groove, raid, ridge, solid, or sunken
Button(root,text = 'hello button',relief=FLAT).pack()
Button(root,text = 'hello button',relief=GROOVE).pack()
Button(root,text = 'hello button',relief=RAISED).pack()
Button(root,text = 'hello button',relief=RIDGE).pack()
Button(root,text = 'hello button',relief=SOLID).pack()
Button(root,text = 'hello button',relief=SUNKEN).pack()

root.mainloop()

'''
Button显示图像
image:可以使用gif图像,图像的加载方法img = PhotoImage(root,file = filepath
bitmap:使用X11 格式的bitmap,WindowsBitmap没法显示的,在Windows下使用GIMP2.4windows
Bitmap转换为xbm文件,依旧无法使用.linux下的X11 bitmap编辑器生成的bitmap还没有测试,但可
以使用内置的位图。
(1).使用位图文件
bp = BitmapImage(file = "c:\\python2.xbm")
Button(root,bitmap = bp).pack()
(2).使用位图数据
BITMAP = """
#define im_width 32
#define im_height 32
static char im_bits[] = {
0xaf,0x6d,0xeb,0xd6,0x55,0xdb,0xb6,0x2f,
0xaf,0xaa,0x6a,0x6d,0x55,0x7b,0xd7,0x1b,
0xad,0xd6,0xb5,0xae,0xad,0x55,0x6f,0x05,
0xad,0xba,0xab,0xd6,0xaa,0xd5,0x5f,0x93,
0xad,0x76,0x7d,0x67,0x5a,0xd5,0xd7,0xa3,
0xad,0xbd,0xfe,0xea,0x5a,0xab,0x69,0xb3,
0xad,0x55,0xde,0xd8,0x2e,0x2b,0xb5,0x6a,
0x69,0x4b,0x3f,0xb4,0x9e,0x92,0xb5,0xed,
0xd5,0xca,0x9c,0xb4,0x5a,0xa1,0x2a,0x6d,
0xad,0x6c,0x5f,0xda,0x2c,0x91,0xbb,0xf6,
0xad,0xaa,0x96,0xaa,0x5a,0xca,0x9d,0xfe,
0x2c,0xa5,0x2a,0xd3,0x9a,0x8a,0x4f,0xfd,
0x2c,0x25,0x4a,0x6b,0x4d,0x45,0x9f,0xba,
0x1a,0xaa,0x7a,0xb5,0xaa,0x44,0x6b,0x5b,
0x1a,0x55,0xfd,0x5e,0x4e,0xa2,0x6b,0x59,
0x9a,0xa4,0xde,0x4a,0x4a,0xd2,0xf5,0xaa
};
"""
使用tuple数据来创建图像
bmp = BitmapImage(data = BITMAP)
Button(root,bitmap = bmp)
'''
'''3.Label一样,Button也可以同时显示文本与图像,使用属性compound'''
from Tkinter import *
root = Tk()
#图像居下,居上,居右,居左,文字位于图像之上
Button(root,text = 'botton',compound = 'bottom',bitmap = 'error').pack()
Button(root,text = 'top',compound = 'top',bitmap = 'error').pack()
Button(root,text = 'right',compound = 'right',bitmap = 'error').pack()
Button(root,text = 'left',compound = 'left',bitmap = 'error').pack()
Button(root,text = 'center',compound = 'center',bitmap = 'error').pack()
#消息循环
root.mainloop()

'''4.控件焦点问题
创建三个Button,各自对应回调函数;将第二个Button设置焦点,程序运行是按Enter”,判断
程序的打印结果
'''
from Tkinter import *

def cb1():
    print 'button1 clicked'
def cb2(event):
    print 'button2 clicked'
def cb3():
    print 'button3 clicked'
   
root = Tk()

b1 = Button(root,text = 'Button1',command = cb1)
b2 = Button(root,text = 'Button2')
b2.bind("<Return>",cb2)
b3 = Button(root,text = 'Button3',command = cb3)
b1.pack()
b2.pack()
b3.pack()

b2.focus_t()
root.mainloop()
'''
上例中使用了bind方法,它建立事件与回调函数(响应函数)之间的关系,每当产生<Enter>事件
后,程序便自动的调用cb2,与cb1,cb3不同的是,它本身还带有一个参数----event,这个参数传递
响应事件的信息。
'''
from Tkinter import *
def printEventInfo(event):
    print 'event.time = ' , event.time
    print 'pe = ' , event.type
    print 'event.WidgetId = ', event.widget
    print 'event.KeySymbol = ',event.keysym
root = Tk()
b = Button(root,text = 'Infomation')
b.bind("<Return>",printEventInfo)
自动挡车起步正确方法b.pack()
b.focus_t()
root.mainloop()   

'''
犯了个错误,将<Return>写成<Enter>了,结果是:当鼠标进入Button区域后,事件printEventInfo
被调用。程序打印出了event的信息。
'''

Tkinter教程之Button篇(2) (2007-09-29 22:55)
# Tkinter教程之Button(2)

'''5.指定Button的宽度与高度
width:    宽度
heigth:    高度
使用三种方式:
1.创建Button对象时,指定宽度与高度
2.使用属性widthheight来指定宽度与高度
3.使用configure方法来指定宽度与高度
'''
from Tkinter import *
root = Tk()
b1 = Button(root,text = '30X1',width = 30,height = 2)
b1.pack()

b2 = Button(root,text = '30X2')
b2['width'] = 30
b2['height'] = 3
b2.pack()

b3 律所实习日志= Button(root,text = '30X3')
b3.configure(width = 30,height = 3)
b3.pack()

root.mainloop()
# 上述的三种方法同样也适合其他的控件
'''6.设置Button文本在控件上的显示位置
anchor
使用的值为:n(north),s(south),w(west),e(east)ne,nw,,sw,就是地图上的标识位置了,使用
widthheight属性是为了显示各个属性的不同。
'''
from Tkinter import *
root = Tk()

#简单就是美!
for a in ['n','s','e','w','ne','nw','','sw']:
    Button(root,
    text = 'anchor',
    anchor = a,
    width = 30,
    height = 4).pack()
#如果看的不习惯,就使用下面的代码。
# Button(root,text = 'anchor',width = 30,height =4).pack()
# Button(root,text = 'anchor',anchor = 'center',width = 30,height =4).pack()
# Button(root,text = 'anchor',anchor = 'n',width = 30,height = 4).pack()
# Button(root,text = 'anchor',anchor = 's',width = 30,height = 4).pack()
# Button(root,text = 'anchor',anchor = 'e',width = 30,height = 4).pack()
# Button(root,text = 'anchor',anchor = 'w',width = 30,height = 4).pack()
# Button(root,text = 'anchor',anchor = 'ne',width = 30,height = 4).荷花介绍pack()
# Button(root,text = 'anchor',anchor = 'nw',width = 30,height = 4).pack()
# Button(root,text = 'anchor',anchor = '',width = 30,height = 4).pack()
# Button(root,text = 'anchor',anchor = 'sw',width = 30,height = 4).pack()

root.mainloop()
'''7.改变Button的前景色与背景色
fg:    前景色
bg:背景色
'''
from Tkinter import *
root = Tk()
bfg = Button(root,text = 'change foreground',fg = 'red')
bfg.pack()

bbg = Button(root,text = 'change backgroud',bg = 'blue')
bbg.pack()

root.mainloop()

'''8.设置Button的边框
bd(bordwidth):缺省为12个像素
'''
# 创建5Button边框宽度依次为:02468
from Tkinter import *
root = Tk()
for b in [0,1,2,3,4]:
    Button(root,
    text = string(b),
    bd = b).pack()
root.mainloop()   

'''9.设置Button的风格
relief/raid/sunken/groove/ridge
'''
from Tkinter import *
root = Tk()
for r in ['raid','sunken','groove','ridge']:
    Button(root,
    text = r,
    relief = r,
    width = 30).pack()
root.mainloop()

'''10.设置Button状态
normal/active/disabled
'''
from Tkinter import *
root = Tk()
def statePrint():
    print 'state'
for r in ['normal','active','disabled']:
    Button(root,
    text = r,
    state = r,
    width = 30,
    command = statePrint).pack()
root.mainloop()
#例子中将三个Button在回调函数都设置为statePrint,运行程序只有normalactive激活了回调函数,而disable按钮则没有,对于暂时不
#需要按钮起作用时,可以将它的state设置为disabled属性

'''11.绑定Button与变量
设置Buttontextvariable属性
'''
from Tkinter import *
root = Tk()
def changeText():
    if b['text'] == 'text':
        v.t('change')
        print 'change'
    el:
        v.t('text')
        print 'text'
v = StringVar()
b = Button(root,textvariable = v,command = changeText)
v.t('text')
b.pack()
root.mainloop()

'''
将变量vButton绑定,当v值变化时,Button显示的文本也随之变化
'''

Tkinter教程之Entry篇 (2007-09-30 19:49)

本文发布于:2023-07-14 07:46:49,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1080901.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:使用   属性   方法   没有
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图