应用程序窗口

基本窗口

在我们一直用的那个简单例子中,屏幕上只有root窗口这一个窗口

当我们调用Tk构造函数后自动生成的,当然对于简单应用程序来说非常方便

from Tkinter import *

root = Tk()

# create window contents as children to root...

root.mainloop()

如果你想创建额外的窗口,你可以使用Toplevel组件,它可以简单的创建一个新窗口,

新窗口和root窗口看起来一样

from Tkinter import *

root = Tk()

# create root window contents...

top = Toplevel()

# create top window contents...

root.mainloop()

你不需要用pack方法显示Toplevel,因为window manager会自动的显示它,

实际上,如果你试图pack 或者其他几何管理一个Toplevel组件会报错。

Menus

Tkinter为菜单提供了一个特殊的组件类型。为了创建一个菜单,你要创建一个Menu类的实例

在调用add方法添加入口

  • add_command(label=string, command=callback) #添加普通的菜单项.

  • add_separator()#添加分隔符

  • add_cascade(label=string, menu=menu instance) 添加子菜单(另一个菜单实例)

  • 可以是下拉式的也可以是弹出式的,依赖父菜单。

  • 下面是例子

  • from Tkinter import *

    def callback():
        print "called the callback!"

    root = Tk()

    # create a menu
    menu = Menu(root)
    root.config(menu=menu)

    filemenu = Menu(menu)
    menu.add_cascade(label="File", menu=filemenu)
    filemenu.add_command(label="New", command=callback)
    filemenu.add_command(label="Open...", command=callback)
    filemenu.add_separator()
    filemenu.add_command(label="Exit", command=callback)

    helpmenu = Menu(menu)
    menu.add_cascade(label="Help", menu=helpmenu)
    helpmenu.add_command(label="About...", command=callback)

    mainloop()

在这个例子中,我们首先创建一个Menu实例,然后使用config方法把它附加到root窗口。

该Menu的内容将用于在根窗口的顶部创建菜单栏,你不用pack函数,因为它是由Tkinter自动显示的。

接下来,我们创建一个新的菜单实例,使用menu这个实例作为父窗口,使用add_cascade方法,将其

作为下拉菜单。然后我们调用add_command向菜单添加命令,这儿用的是同一个回调函数

。add_separator方法在中间加一条横线。

工具栏

许多应用程序在菜单栏的下面放置了一个工具栏,通常包含许多常用功能的按钮,比如打开文件、打印等

在下面的例子中,我们使用frame作为工具栏,并放置一些普通的按钮。

创建简单的工具栏

from Tkinter import *

root = Tk()

def callback():
    print "called the callback!"

# create a toolbar
toolbar = Frame(root)

b = Button(toolbar, text="new", width=6, command=callback)
b.pack(side=LEFT, padx=2, pady=2)

b = Button(toolbar, text="open", width=6, command=callback)
b.pack(side=LEFT, padx=2, pady=2)

toolbar.pack(side=TOP, fill=X)

mainloop()

按钮靠左放,toolbar自己靠着上面放,使用fill选项,设置为X的意思是如果组件被缩放了,将按照

X轴铺满。另外这里用的是文本形式的按钮,也可以用图形形式的。

Status Bars

大多数应用程序的底部有状态栏。使用Tkinter实现状态栏很简单,你可以使用Label组件。以下是代码

status = Label(master, text="", bd=1, relief=SUNKEN, anchor=W)

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

如果你想更好看些,你可以用下面的类

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的功能,接受格式化字符串。注意它还调用了

update_idletasks方法,保证可以刷新状态栏