注:本文可轉載,轉載請注明出處:http://www.cnblogs.com/collectionne/p/6885066.html。格式修改未完成。
Tkinter資料
Python Wiki, TkInter
effbot.org, An Introduction to Tkinter
New Mexico Tech Computer Center, Tkinter 8.5 Reference, a GUI for Python
還有更多資料,詳情請訪問第一個Python Wiki鏈接。
Tkinter介紹
Python支持多個圖形庫,例如Qt、wxWidgets,等等。但是Python的標准GUI庫是Tkinter。Tkinter是Tk Interface的縮寫。Python提供了tkinter包,里面含有Tkinter接口。
開始寫程序
要使用Tkinter,首先需要導入Python提供的tkinter模塊:
import tkinter as tk
這個語句導入tkinter模塊,但為方便,為它定義了一個別名tk。
GUI系統中,普遍有一個控件(widget)的概念。控件就是指按鈕、滾動條、文本框這些東西。特殊地,窗口也是一個控件,窗口可以容納其它控件。在Tkinter中,用Frame類表示窗口。我們的程序可以直接創建一個Frame對象再向里面添加控件,但習慣上會從Frame類派生出Application類(也可以叫其它名字):
class Application(tk.Frame):
接下來我們需要為Application編寫構造函數__init__:
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.grid()
self.createWidgets()
首先,__init__有兩個參數。第一個是self,即Application對象本身。第二個是master,在Tkinter中,一個控件可能屬於另一個控件,這時另一個控件就是這個控件的master。默認一個窗口沒有master,因此master有None的默認值。
第二行tk.Frame.__init__(self, master)調用Application的父類Frame的__init__函數初始化Application類的Frame類部分。__init__函數的定義如下:
__init__(self, master=None, cnf={}, **kw)
初始化Frame對象。master為Frame的父控件,默認為None;cnf尚不清楚;kw為命名關鍵字參數,可接受的參數將在后面提到。
因為這里不是直接用對象調用函數,又不是一般意義的創建對象(例如后面的quitButton),而是初始化自身的一部分,因此需要傳入self。我們還傳入了Application.__init__的master參數,作為Frame.__init__的master。
第三行self.grid(),顯示窗口並使用grid布局。grid方法是從Frame繼承來的。Tkinter中有一個概念叫布局(layout),就是控件的排列方式。除了grid(),還有pack等布局。
第四行self.createWidgets(),調用后面定義的createWidgets方法。
然后是createWidgets方法的定義:
def createWidgets(self):
self.quitButton = tk.Button(self, text='Quit', command=self.quit)
self.quitButton.grid()
createWidgets函數的定義就不講了,只有一個self參數。
第二行self.quitButton = tk.Button(self, text='Quit', command.self.quit),為Application類創建了一個quitButton屬性,類型為Button。Button的構造函數如下:
__init__(self, master=None, cnf={}, **kw)
初始化Button對象。master為Button的父控件,默認為None;cnf尚不清楚;kw為命名關鍵字參數,可接受的參數有text(標准)、command(按鈕特有),其它參數將在以后提到。
這里和前面不同,不是初始化自身,而是創建了quitButton屬性,因此不需要寫Button.__init__(...),而是直接寫Button(...),也不需要像前面一樣傳入self。那為什么還要傳入self呢?這個self並不是對應於Button.__init__中的self參數,而是master參數,表示按鈕的父控件是窗口!
我們還傳入了text和command兩個命名關鍵字參數。text是顯示在按鈕上的文字,這里為'Quit';command為點擊按鈕時調用的函數,這里為Frame類的quit函數,quit函數會使程序退出。
第三行,self.quitButton.grid(),和前面一樣,顯示按鈕並使用grid()布局。
然后就輪到創建Application對象了:
app = Application() app.master.title = 'First Tkinter' app.mainloop()
第一行app = Application(),創建一個名為app的Application對象。
第二行app.master.title = 'First Tkinter',將窗口的標題設置為'First Tkinter'。當然可能會因為窗口太小,看不見標題。
第三行app.mainloop(),進入主循環。
現在運行你的程序,看看是不是點擊Quit按鈕就會退出了。當然你也可以通過點擊窗口上方的關閉按鈕退出。
主循環
GUI程序中有一個主循環(main loop)的概念。用偽代碼的形式表現出來,是類似於這樣的:
while noQuitCommands:
checkInput()
updateWidgets()
...
主循環會一直執行,直到出現退出請求。在主循環中,會檢查用戶輸入(例如鼠標、鍵盤等),並更新控件。這里,如果發現鼠標點擊了按鈕,就會執行按鈕的command,而command是Frame.quit,執行command相當於執行了Frame.quit,循環就結束了,控件全部銷毀,程序結束。
最終代碼
下面是本課的最終代碼,配上完整注釋:
# 導入tkinter包,為其定義別名tk import tkinter as tk # 定義Application類表示應用/窗口,繼承Frame類 class Application(tk.Frame): # Application構造函數,master為窗口的父控件 def __init__(self, master=None): # 初始化Application的Frame部分 tk.Frame.__init__(self, master) # 顯示窗口,並使用grid布局 self.grid() # 創建控件 self.createWidgets() # 創建控件 def createWidgets(self): # 創建一個文字為'Quit',點擊會退出的按鈕 self.quitButton = tk.Button(self, text='Quit', command=self.quit) # 顯示按鈕,並使用grid布局 self.quitButton.grid() # 創建一個Application對象app app = Application() # 設置窗口標題為'First Tkinter' app.master.title = 'First Tkinter' # 主循環開始 app.mainloop()
