应用程序窗口
基本窗口
在我们一直用的那个简单例子中,屏幕上只有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方法,保证可以刷新状态栏