Tkinter入门
前页 | 第八章. 应用窗口 | 后页

# 状态条

大多数的应用程序都会在应用窗口. 用Tkinter来实现状态条比较麻烦些:你可以简单地使用一个经过配置过的 `Label` 组件, 并改变它的 `text` 选项. 这里给出了一个方法:

        status = Label(master, text="", bd=1, relief=SUNKEN, anchor=W)
        status.pack(side=BOTTOM, fill=X)

如果你需要一点个性化,你可以使用下面的类来代替. 它封装了一个label组件到一个现成的类中, 并提供了 `set` 和 `clear` 方法来更换显示内容.

范例 8-3. 一个状态条类

    # File: tkSimpleStatusBar.py

    class StatusBar(Frame):

        def __init__(self, master):
            Frame.__init__(self, master)
            self.label = Label(self, bd=1, relief=SUNKEN, anchor=W)
            self.label.pack(fill=X)

        def set(self, format, *args):
            self.label.config(text=format % args)
            self.label.update_idletasks()

        def clear(self):
            self.label.config(text="")
            self.label.update_idletasks()

`set` 方法的使用方式类似与 C 的 `printf` 函数; 它使用一个格式化字符串,跟着几个可能的参数, (它有一个缺点,如果你要显示一个任意一串文字,都必须象这样操作 `set("%s", string)`). 请注意,在这个方法中label调用了`update_idletasks` 方法 来确定未定提取操作, to make sure pending draw operations (例如状态条更新) 并立刻执行.

但这里真正的技巧是，我们从 `Frame` 组件进行了继承。以调用frame组件构造函数这个有些令人麻烦的调用为代价，我们创建了一种新型自制组件，可以把它看成其它任一种组件。你可以使用通常的组件语法来创建和显示状态条:

        status = StatusBar(root)
        status.pack(side=BOTTOM, fill=X)

我们也可以从Label组件本身来进行继承，只使用 `set` 和 `clear` 方法对它进行扩展。但这个方法考虑到下面情况，有几个缺点：

- 集中维护状态条很困难。某些团队成员可能会作弊，使用 `config` 来代替 `set`。直到有一天你决定在 `set` 方法中做一些额外的处理，或某天你决定使用一个 `Canvas`组件来实现一个奇特的状态条，这可能就是一个大问题了.

- 它会增加你的附加方法与Tkinter所用的属性或方法产生冲突的危险性。`Frame` 和 `Toplevel` 组件相对来说没有几个方法，而其它组件却能有几打与组件相关的属性或方法.

- Tkinter的未来版本对于大部分组件来说可能使用factory(工厂)函数而不是类构造函数。然而，或多或少都会保证这样的版本将仍然会提供 `Frame` 和 `Toplevel` 类。换句话说，有把握的要比拿不准的强.

注:本篇由limodou翻译

前页 | Home | 后页
状态条 | 向上 | 标准对话框