L2cl~~整理rilydb@126.com什么是TkinterTkinter(也叫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.pyfromTkinterimport*root=Tk()w=Label(root,text=Hello,world!)w.pack()root.mainloop()运行结果如下:关闭这个窗口即可终止这个程序的运行。二、对代码的说明:L2cl~~整理rilydb@126.com我们通过导入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.pyfromTkinterimport*classApp:def__init__(self,master):frame=Frame(master)L2cl~~整理rilydb@126.comframe.pack()self.button=Button(frame,text=QUIT,fg=red,command=frame.quit)self.button.pack(side=)self.hi_there=Button(frame,text=Hello,command=self.say_hi)self.hi_there.pack(side=LEFT)defsay_hi(self):printhithere,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选项。这L2cl~~整理rilydb@126.com个选项指定了一个函数或方法,在按钮被点击时会被调用。按钮实例被存储在实例属性组中。side=LEFT参数表示这两个按钮在帧中将被分开放置;第一个按钮被放置在帧的左边缘,第二个被放在第一个的右边(帧的左边缘仍保留着空格)。默认情况下,部件的放置都是相对于它们的父亲(frame部件相对于master,button相对于frame)。如果side选项没指定,side默认值为TOP。Hello按钮的回调函数如下所示,它在按钮每次被按下时简单地打印一条信息给控制台:defsay_hi(self):printhithere,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)L2cl~~整理rilydb@126.com关于窗口部件的名字另一个容量引起混淆的方面(尤其是使用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:组织图形。这个部件可以用来绘制图表和图,创建图形编辑器,实现定制窗口部件。L2cl~~整理rilydb@126.comCheckbutton:代表一个变量,它有两个不同的值。点击这个按钮将会在这两个值间切换。Entry:文本输入域。Frame:一个容器窗口部件。帧可以有边框和背景,当创建一个应用程序或dialog(对话)版面时,帧被用来组织其它的窗口部件。Label:显示一个文本或图象。Listbox:显示供选方案的一个列表。listbox能够被配置来得到radiobutton或checklist的行为。Menu:菜单条。用来实现下拉和弹出式菜单。Menubutton:菜单按钮。用来实现下拉式菜单。Message:显示一文本。类似label窗口部件,但是能够自动地调整文本到给定的宽度或比率。Radiobutton:代表一个变量,它可以有多个值中的一个。点击它将为这个变量设置值,并且清除与这同一变量相关的其它radiobutton。Scale:允许你通过滑块来设置一数字值。Scrollbar:为配合使用canvas,entry,listbox,andtext窗口部件的标准滚动条。Text:格式化文本显示。允许你用不同的样式和属性来显示和编辑文本。同时支持内嵌图象和窗口。Toplevel:一个容器窗口部件,作为一个单独的、最上面的窗口显示。注意在Tkinter中窗口部件类没有分级;所有的窗口部件类在树中都是兄弟。L2cl~~整理rilydb@126.com所有这些窗口部件提供了Misc和几何管理方法、配置管理方法和部件自己定义的另外的方法。此外,Toplevel类也提供窗口管理接口。这意味一个典型的窗口部件类提供了大约150种方法。Button窗口部件Button(按钮)窗口部件是一个标准的Tkinter窗口部件,用来实现各种按钮。按钮能够包含文本或图象,并且你能够将按钮与一个Python函数或方法相关联。当这个按钮被按下时,Tkinter自动调用相关联的函数或方法。按钮仅能显示一种字体,但是这个文本可以跨行。另外,这个文本中的一个字母可