注:本文可轉載,轉載請註明出處:http://www.cnblogs.com/collectionne/p/6885066.html。格式修改未完成。html
Python Wiki, TkInterpython
effbot.org, An Introduction to Tkinterweb
New Mexico Tech Computer Center, Tkinter 8.5 Reference, a GUI for Pythonapp
還有更多資料,詳情請訪問第一個Python Wiki連接。函數
Python支持多個圖形庫,例如Qt、wxWidgets,等等。可是Python的標準GUI庫是Tkinter。Tkinter是Tk Interface的縮寫。Python提供了tkinter包,裏面含有Tkinter接口。oop
要使用Tkinter,首先須要導入Python提供的tkinter模塊:佈局
import tkinter as tk
這個語句導入tkinter模塊,但爲方便,爲它定義了一個別名tk。ui
GUI系統中,廣泛有一個控件(widget)的概念。控件就是指按鈕、滾動條、文本框這些東西。特殊地,窗口也是一個控件,窗口能夠容納其它控件。在Tkinter中,用Frame類表示窗口。咱們的程序能夠直接建立一個Frame對象再向裏面添加控件,但習慣上會從Frame類派生出Application類(也能夠叫其它名字):spa
class Application(tk.Frame):
接下來咱們須要爲Application編寫構造函數__init__:htm
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()