Tkinter学习笔记


本文通过工具从以前的 html 转成 markdown,格式可能有问题。

什么是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模块, 代码如下: import Tkinter 或 from Tkinter import *

第一个Tkinter程序

File: hello1.py

from Tkinter import *

root = Tk()

w = Label(root, text="Hello, world!")
w.pack()

root.mainloop()

运行结果如下: 转-Tkinter入门(一) 关闭这个窗口即可终止这个程序的运行。

二、对代码的说明:

我们通过导入Tkinter模块开始。Tkinter模块包含了用Tk工具包工作所需的所有的类,函数和其它一些必须的东西。在大多数情况下,你只需要简单的从Tkinter导入所有的东西到你的模块的名字空间,如下所示: from Tkinter import *

然 后初始化Tkinter,方法是我们必须先创建一个Tk root(根)窗口部件,它是一个普通的窗口,带有标题条和其它由你的窗口管理器供给的附属。你 应该只创建一个root窗口部件,这个root窗口部件必须在其它窗口部件创建之前创建。初始化Tkinter的代码如下:

root = Tk()

接着我们创建一个Label(标签)窗口部件作为这个root窗口的孩子,代码如下:

w = Label(root, text="Hello, world!")

Label窗口部件可以显示文本、图标或图象。我们这里用text选项来指定要显示的文本。

接下来我们在Label窗口部件上调用了pack方法,它告诉Label窗口部件去调整自己的尺寸来适应所给定文本的大小,并且使用自己可见,代码如下:

w.pack()

但是在这些发生之前,我们必须进入Tkinter的事件循环,代码如下:

root.mainloop()

这 个程序将一直处在事件循环之中,直到我们关闭了这个窗口。事件循环不仅仅处理来自用户的事件(如鼠标敲击和按键按下)或者窗口系统(重绘事件和窗口配置消 息),它也处理来自Tkinter自身的工作等待队列,这些工作之一就包括由pack方法所产生的工作和显示更新。这就意味着这个应用程序窗口在进入这个 事件循环之前将不会显示出来。

第二个Tkinter程序

当我们在写一个较大的程序的时候,把代码封装在类中通常是一个好的主意。

File: hello2.py

from Tkinter import *

class App:

    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)

    def say_hi(self):
        print "hi there, everyone!"

root = Tk()

app = App(root)

root.mainloop()

运行结果如下: 转-Tkinter入门(一) 如果你点击Hello按钮,将在控制台打印出”hi there, everyone!” 。如果你点击QUIT按钮,程序将终止。

二、代码说明:

这个简单的应用程序被写成了一个类。这个构造器(init 方法)通过一个父部件被调用,并针对父部件增加了一些子部件。构造器通过创建一个Frame(帧)窗口部件开始。一个帧是一个简单的容器,在这个例子中,我们仅用来容纳另外的两个部件。

class App:
    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”按钮的回调函数如下所示,它在按钮每次被按下时简单地打印一条信息给控制台:

def say_hi(self):
    print "hi there, everyone!"

最后我们提供了一些脚本级的代码来创建一个Tk root部件,和一个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函数:

>>> print str(ok)
.1428748.1432920

如果你确实需要为一个窗口部件指定一个名字,你可以在你创建这个窗口部件时使用name选项。你这么做的原因可能是你需要和用Tcl写的代码接口。

下面的例子将产生一个名为”.dialog.ok”的窗口部件(如果你忘了命名dialog,那么名字可能类似”.1428748.ok”): ok = Button(dialog, name=“ok”)

为了避免与此同时Tkinter的名字机制相冲突,不要使用只包含数字的名字。同样注意name是只能创建一次的选项;一旦你创建了这个部件的名字,那么你就不能再改变它的名字了。

Avatar
huiren
Code Artisan

问渠那得清如许,为有源头活水来

下一页
上一页
comments powered by Disqus