Tkinter基本入门文字教程详细介绍Tkinter各项例程.doc
《Tkinter基本入门文字教程详细介绍Tkinter各项例程.doc》由会员分享,可在线阅读,更多相关《Tkinter基本入门文字教程详细介绍Tkinter各项例程.doc(42页珍藏版)》请在冰点文库上搜索。
L2cl~~整理rilydb@
什么是Tkinter
Tkinter(也叫Tk接口)是Tk图形用户界面工具包标准的Python接口。
Tk是一个轻量级的跨平台图形用户界面(GUI)开发工具。
Tk和Tkinter可以运行在大多数的Unix平台、Windows、和Macintosh系统。
Tkinter由一定数量的模块组成。
Tkinter位于一个名为_tkinter(较早的版本名为tkinter)的二进制模块中。
Tkinter包含了对Tk的低级接口模块,低级接口并不会被应用级程序员直接使用,通常是一个共享库(或DLL),但是在一些情况下它也被Python解释器静态链接。
除了Tk接口模块,Tkinter也包含了一定数量的Python模块。
其中两个最重要的模块是Tkinter本身和名为Tkconstants的模块。
前者自动引导后者,因此使用Tkinter,你首先需要做的是导入Tkinter模块,
代码如下:
importTkinter
或
fromTkinterimport*
第一个Tkinter程序
一、代码如下:
#File:
hello1.py
fromTkinterimport*
root=Tk()
w=Label(root,text="Hello,world!
")
w.pack()
root.mainloop()
运行结果如下:
关闭这个窗口即可终止这个程序的运行。
二、对代码的说明:
我们通过导入Tkinter模块开始。
Tkinter模块包含了用Tk工具包工作所需的所有的类,函数和其它一些必须的东西。
在大多数情况下,你只需要简单的从Tkinter导入所有的东西到你的模块的名字空间,如下所示:
fromTkinterimport*
然后初始化Tkinter,方法是我们必须先创建一个Tkroot(根)窗口部件,它是一个普通的窗口,带有标题条和其它由你的窗口管理器供给的附属。
你应该只创建一个root窗口部件,这个root窗口部件必须在其它窗口部件创建之前创建。
初始化Tkinter的代码如下:
root=Tk()
接着我们创建一个Label(标签)窗口部件作为这个root窗口的孩子,代码如下:
w=Label(root,text="!
")
Label窗口部件可以显示文本、图标或图象。
我们这里用text选项来指定要显示的文本。
接下来我们在Label窗口部件上调用了pack方法,它告诉Label窗口部件去调整自己的尺寸来适应所给定文本的大小,并且使用自己可见,代码如下:
w.pack()
但是在这些发生之前,我们必须进入Tkinter的事件循环,代码如下:
root.mainloop()
这个程序将一直处在事件循环之中,直到我们关闭了这个窗口。
事件循环不仅仅处理来自用户的事件(如鼠标敲击和按键按下)或者窗口系统(重绘事件和窗口配置消息),它也处理来自Tkinter自身的工作等待队列,这些工作之一就包括由pack方法所产生的工作和显示更新。
这就意味着这个应用程序窗口在进入这个事件循环之前将不会显示出来。
第二个Tkinter程序
当我们在写一个较大的程序的时候,把代码封装在类中通常是一个好的主意。
一、代码如下:
#File:
hello2.py
fromTkinterimport*
classApp:
def__init__(self,master):
frame=Frame(master)
frame.pack()
self.button=Button(frame,text="QUIT",fg="red",command=frame.quit)
self.button.pack(side=LEFT)
self.hi_there=Button(frame,text="Hello",command=self.say_hi)
self.hi_there.pack(side=LEFT)
defsay_hi(self):
print"hithere,everyone!
"
root=Tk()
app=App(root)
root.mainloop()
运行结果如下:
如果你点击Hello按钮,将在控制台打印出"hithere,everyone!
"。
如果你点击QUIT按钮,程序将终止。
二、代码说明:
这个简单的应用程序被写成了一个类。
这个构造器(__init__方法)通过一个父部件被调用,并针对父部件增加了一些子部件。
构造器通过创建一个Frame(帧)窗口部件开始。
一个帧是一个简单的容器,在这个例子中,我们仅用来容纳另外的两个部件。
classApp:
def__init__(self,master):
frame=Frame(master)
frame.pack()
这个帧实例被存储在一个名为Frame的局部变量中。
在创建了这个部件后,我们立即调用pack方法来使用这个帧可见。
然后我们创建两个Button(按钮)窗口部件作为这个帧的孩子。
self.button=Button(frame,text="QUIT",fg="red",command=frame.quit)
self.button.pack(side=LEFT)
self.hi_there=Button(frame,text="Hello",command=self.say_hi)
self.hi_there.pack(side=LEFT)
这次,我们传递了一定数量的选项给构造器。
第一个按钮被标为"QUIT",字为红色(fg是foreground<前景色>的缩写)。
第二个被标为"Hello"。
两个按钮都有一个command选项。
这个选项指定了一个函数或方法,在按钮被点击时会被调用。
按钮实例被存储在实例属性组中。
side=LEFT参数表示这两个按钮在帧中将被分开放置;第一个按钮被放置在帧的左边缘,第二个被放在第一个的右边(帧的左边缘仍保留着空格)。
默认情况下,部件的放置都是相对于它们的父亲(frame部件相对于master,button相对于frame)。
如果side选项没指定,side默认值为TOP。
"Hello"按钮的回调函数如下所示,它在按钮每次被按下时简单地打印一条信息给控制台:
defsay_hi(self):
print"hithere,everyone!
"
最后我们提供了一些脚本级的代码来创建一个Tkroot部件,和一个App类的实例(这个实例使用这个root部件作为它的父亲):
root=Tk()
app=App(root)
root.mainloop()
root.mainloop()调用root部件的mainloop方法。
它进入Tk事件循环,这个应用程序将处于这个Tk事件循环之中直到quit方法被调用(点击QUIT按钮),或窗口被关闭。
关于窗口部件引用
在第二个例子中,frame部件被存储在一个名为frame的局部变量中,而button部件则存储在两个实例的属性组中。
这是否隐藏着一个严重的问题呢:
当__init__函数返回并且frame变量超出了范围会发生什么呢?
。
不要紧;这儿确实没有必要去保持对窗口部件实例的引用。
Tkinter自动维护一个窗口部件树(通过对象实例的master和children属性),因此,当应用程序的最后一个引用消失时窗口部件不会消失;窗口部件必须显示的用destroy方法销毁。
但是如果你希望在窗口部件被创建以后用它来做一些事情,你最好保持对你自己的窗口部件实例的引用。
注意如果你不需要保持对一个窗口部件的引用,你可以用单独的一行来创建和pack(包装)它,如下:
Button(frame,text="Hello",command=self.hello).pack(side=LEFT)
不要存储这个操作的结果,当你试图去用这个结果时你会很失望(因为pack方法返回None)。
为小心起见,最好将将pack(包装)分开,如下所示:
w=Button(frame,text="Hello",command=self.hello)
w.pack(side=LEFT)
关于窗口部件的名字
另一个容量引起混淆的方面(尤其是使用Tcl编程Tk的有一些经验的人)是Tinter的窗口部件的名字的概念。
在Tcl中,你必须显示的命名每一个窗口部件。
例如下面的Tcl命令创建一个名为ok的按钮作为名为dialog的窗口部件的孩子(dialog又是root窗口的孩子):
button.dialog.ok
相应的Tkinter调用将如下:
ok=Button(dialog)
在这个Tkinter案例中,ok和dialog是对窗口部件实例的引用,不是窗口部件实际的名字。
因为Tk自身需要这些名字,Tkinter自动为每个新窗口部件赋一个唯一的名字。
在这个Tkinter案例中,这个dialog的名字或许类似".1428748",并且button可能是".1428748.1432920"。
如果你希望得到一个Tkinter窗口部件的完整名字,你可以在这个窗口部件实例上使用str函数:
>>>printstr(ok)
.1428748.1432920
如果你确实需要为一个窗口部件指定一个名字,你可以在你创建这个窗口部件时使用name选项。
你这么做的原因可能是你需要和用Tcl写的代码接口。
下面的例子将产生一个名为".dialog.ok"的窗口部件(如果你忘了命名dialog,那么名字可能类似".1428748.ok"):
ok=Button(dialog,name="ok")
为了避免与此同时Tkinter的名字机制相冲突,不要使用只包含数字的名字。
同样注意name是只能创建一次的选项;一旦你创建了这个部件的名字,那么你就不能再改变它的名字了。
Tkinter类之窗口部件类
Tkinter支持15个核心的窗口部件,这个15个核心窗口部件类列表如下:
窗口部件及说明:
Button:
一个简单的按钮,用来执行一个命令或别的操作。
Canvas:
组织图形。
这个部件可以用来绘制图表和图,创建图形编辑器,实现定制窗口部件。
Checkbutton:
代表一个变量,它有两个不同的值。
点击这个按钮将会在这两个值间切换。
Entry:
文本输入域。
Frame:
一个容器窗口部件。
帧可以有边框和背景,当创建一个应用程序或dialog(对话)版面时,帧被用来组织其它的窗口部件。
Label:
显示一个文本或图象。
Listbox:
显示供选方案的一个列表。
listbox能够被配置来得到radiobutton或checklist的行为。
Menu:
菜单条。
用来实现下拉和弹出式菜单。
Menubutton:
菜单按钮。
用来实现下拉式菜单。
Message:
显示一文本。
类似label窗口部件,但是能够自动地调整文本到给定的宽度或比率。
Radiobutton:
代表一个变量,它可以有多个值中的一个。
点击它将为这个变量设置值,并且清除与这同一变量相关的其它radiobutton。
Scale:
允许你通过滑块来设置一数字值。
Scrollbar:
为配合使用canvas,entry,listbox,andtext窗口部件的标准滚动条。
Text:
格式化文本显示。
允许你用不同的样式和属性来显示和编辑文本。
同时支持内嵌图象和窗口。
Toplevel:
一个容器窗口部件,作为一个单独的、最上面的窗口显示。
注意在Tkinter中窗口部件类没有分级;所有的窗口部件类在树中都是兄弟。
所有这些窗口部件提供了Misc和几何管理方法、配置管理方法和部件自己定义的另外的方法。
此外,Toplevel类也提供窗口管理接口。
这意味一个典型的窗口部件类提供了大约150种方法。
Button窗口部件
Button(按钮)窗口部件是一个标准的Tkinter窗口部件,用来实现各种按钮。
按钮能够包含文本或图象,并且你能够将按钮与一个Python函数或方法相关联。
当这个按钮被按下时,Tkinter自动调用相关联的函数或方法。
按钮仅能显示一种字体,但是这个文本可以跨行。
另外,这个文本中的一个字母可以有下划线,例如标明一个快捷键。
默认情况,Tab键用于将焦点移动到一个按钮部件。
一、那么什么时候用按钮部件呢?
简而言之,按钮部件用来让用户说“马上给我执行这个任务”,通常我们用显示在按钮上的文本或图象来提示。
按钮通常用在工具条中或应用程序窗口中,并且用来接收或忽略输入在对话框中的数据。
关于按钮和输入的数据的配合,可以参看Checkbutton和Radiobutton部件。
二、样式
普通的按钮很容易被创建,仅仅指定按钮的内容(文本、位图、图象)和一个当按钮被按下时的回调函数即可:
b=Button(master,text="OK",command=self.ok)
没有回调函数的按钮是没有用的,当你按下这个按钮时它什么也不做。
你可能在开发一个应用程序的时候想实现这种按钮,比如为了不干扰你的beta版的测试者:
b=Button(master,text="Help",state=DISABLED)
如果你没有指定尺寸,按钮的大小将正好能够容纳它的内容。
你可以用padx和pady选项来增加内容与按钮边框的间距。
你也可以用height和width选项来显式地设置按钮的尺寸。
如果你在按钮中显示文本,那么这些选项将以文本的单位为定义按钮的尺寸。
如果你替而代之显示图象,那么按钮的尺寸将是象素(或其它的屏幕单位)。
你实际上甚至能够用象素单位来定义文本按钮的尺寸,但这可能带来意外的结果。
下面是指定尺寸的一段例子代码:
f=Frame(master,height=32,width=32)
f.pack_propagate()#don'tshrink
b=Button(f,text="Sure!
")
b.pack(fill=BOTH,expand=1)
按钮能够显示多行文本(但只能用一种字体)。
你可以使用多行或wraplength选项来使按钮自己调整文本。
当调整文本时,使用anchor,justify,也可加上padx选项来得到你所希望的格式。
一个例子如下:
b=Button(master,text=longtext,anchor=W,justify=LEFT,padx=2)
为了使一个普通的按钮看起来像凹入的,例如你想去实现某种类型的工具框,你可简单地将relief的值从"RAISED"改变为"SUNKEN:
b.config(relief=SUNKEN)
你也可能想改变背景。
注意:
一个大概更好的解决方案是使用一个Checkbutton或Radiobutton其indicatoron选项的值设置为false:
b=Checkbutton(master,image=bold,variable=var,indicatoron=0)
三、方法
Button窗口部件支持标准的Tkinter窗口部件接口,加上下面的方法:
flash():
频繁重画按钮,使其在活动和普通样式下切换。
invoke():
调用与按钮相关联的命令。
下面的方法与你实现自己的按钮绑定有关:
tkButtonDown(),tkButtonEnter(),tkButtonInvoke(),tkButtonLeave(),tkButtonUp()
这些方法可以用在定制事件绑定中,所有这些方法接收0个或多个形参。
四、选项
Button窗口部件支持下面的选项:
activebackground,activeforeground
类型:
颜色;
说明:
当按钮被激活时所使用的颜色。
anchor
类型:
常量;
说明:
控制按钮上内容的位置。
使用N,NE,E,SE,S,SW,W,NW,orCENTER这些值之一。
默认值是CENTER。
background(bg),foreground(fg)
类型:
颜色;
说明:
按钮的颜色。
默认值与特定平台相关。
bitmap
类型:
位图;
说明:
显示在窗口部件中的位图。
如果image选项被指定了,则这个选项被忽略。
下面的位图在所有平台上都有效:
error,gray75,gray50,gray25,gray12,hourglass,info,questhead,question,和warning.
这后面附加的位图仅在Macintosh上有效:
document,stationery,edition,application,accessory,folder,pfolder,trash,floppy,ramdisk,cdrom,preferences,querydoc,stop,note,和caution.
你也可以从一个XBM文件中装载位图。
只需要在XBM文件名前加一个前缀@,例如"@sample.xbm"。
borderwidth(bd)
类型:
整数;
说明:
按钮边框的宽度。
默认值与特定平台相关。
但通常是1或2象素。
command
类型:
回调;
说明:
当按钮被按下时所调用的一个函数或方法。
所回调的可以是一个函数、方法或别的可调用的Python对象。
cursor
类型:
光标;
说明:
当鼠标移动到按钮上时所显示的光标。
default
类型:
常量;
说明:
如果设置了,则按钮为默认按钮。
注意这个语法在Tk8.0b2中已改变。
disabledforeground
类型:
颜色;
说明:
当按钮无效时的颜色。
font
类型:
字体;
说明:
按钮所使用的字体。
按钮只能包含一种字体的文本。
highlightbackground,highlightcolor
类型:
颜色;
说明:
控制焦点所在的高亮边框的颜色。
当窗口部件获得焦点的时候,边框为highlightcolor所指定的颜色。
否则边框为highlightbackground所指定的颜色。
默认值由系统所定。
highlightthickness
类型:
距离;
说明:
控制焦点所在的高亮边框的宽度。
默认值通常是1或2象素。
image
类型:
图象;
说明:
在部件中显示的图象。
如果指定,则text和bitmap选项将被忽略。
justify
类型:
常量;
说明:
定义多行文本如何对齐。
可取值有:
LEFT,RIGHT,或CENTER。
padx,pady
类型:
距离;
说明:
指定文本或图象与按钮边框的间距。
relief
类型:
常量;
说明:
边框的装饰。
通常按钮按下时是凹陷的,否则凸起。
另外的可能取值有GROOVE,RIDGE,和FLAT。
state
类型:
常量;
说明:
按钮的状态:
NORMAL,ACTIVE或DISABLED。
默认值为NORMAL。
takefocus
类型:
标志;
说明:
表明用户可以Tab键来将焦点移到这个按钮上。
默认值是一个空字符串,意思是如果按钮有按键绑定的话,它可以通过所绑定的按键来获得焦点。
text
类型:
字符串;
说明:
显示在按钮中的文本。
文本可以是多行。
如果bitmaps或image选项被使用,则text选项被忽略。
textvariable
类型:
变量;
说明:
与按钮相关的Tk变量(通常是一个字符串变量)。
如果这个变量的值改变,那么按钮上的文本相应更新。
underline
类型:
整数;
说明:
在文本标签中哪个字符加下划线。
默认值为-1,意思是没有字符加下划线。
width,height
类型:
距离;
说明:
按钮的尺寸。
如果按钮显示文本,尺寸使用文本的单位。
如果按钮显示图象,尺寸以象素为单位(或屏幕的单位)。
如果尺寸没指定,它将根据按钮的内容来计算。
wraplength
类型:
距离;
说明:
确定一个按钮的文本何时调整为多行。
它以屏幕的单位为单位。
默认不调整。
Mixins
Tkinter模块提供了相应于Tk中的各种窗口部件类型的类和一定数量的mixin和别的帮助类(mixin是一个类,被设计来使用多态继承与其它的类结合)。
当你使用Tkinter时,你不将直接访问mixin类。
一、实施mixins
通过root窗口和窗口部件类,Misc类被用作mixin。
它提供了大量的Tk和窗口相关服务,这些服务对所有Tkinter核心窗口部件者有效。
这些通过委托完成;窗口部件仅仅直接请求适当的内部对象。
Wm类通过root窗口和顶级窗口部件类被用作mixin。
通过委托它提供了窗口管理服务。
使用委托像这样简化你的应用程序代码:
一旦你有一窗口部件,你能够使用这个窗口部件的实例的方法访问Tkinter的所有部份。
二、Geometry(几何学)与mixins
Grid,Pack,Place这些类通过窗口部件类被用作mixins。
通过委托,它们也提供了访问不同几何管理的支持。
下面是GeometryMixins的列表及说明:
管理器及说明:
Grid:
grid几何管理器允许你通过在一个二维网格中组织窗口部件来创建一个类似表的版面。
Pack:
pack几何管理器通过在一个帧中把窗口部件包装到一个父部件中来创建一个版面。
为了对窗口部件使用这个几何管理器,我们在这个窗口部件上使用pack方法来集成。
Place:
place几何管理器让你显式将一个窗口部件放到给定的位置。
要使用这个几何管理器,需使用place方法。
三、窗口部件配置管理
Widget类使用geometrymixins来混合Misc类,并通过cget和configure方法来增加配置管理,也可以通过一个局部的字典接口。
窗口部件的配置
要配置一个窗口部件的外观,你用选项比使用方法调用好。
典型的选项包括text、color、size、command等等。
对于处理选项,所有的核心窗口部件执行同样的配置接口:
配置接口
widgetclass(master,option=value,...)=>widget
说明:
创建这个窗口部件的一个实例,这个实例作为给定的master的孩子,并且使用给定的选项。
所有的选项都有默认值,因此在简单的情况下,你仅需要指定这个master