Python Tkinter學習(1)——第一個Tkinter程序


注:本文可轉載,轉載請注明出處: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對象。masterFrame的父控件,默認為Nonecnf尚不清楚;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()

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM