應用程序窗口
基本窗口
在我們一直用的那個簡單例子中,屏幕上只有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方法,保證可以刷新狀態欄