相信剛學習使用Python進行GUI編程的時候,肯定都會聽過Tkinter,畢竟是standard Python interface to the Tk GUI toolkit.用來寫一些小程序還是很方便的。但如果是剛接觸GUI編程的話肯定是被官方文檔搞的有些懵,畢竟還沒弄清楚套路。之前使用過Tkinter,但是有段時間沒碰了,最近又要寫個小程序需要再撿起來,本想著搜索下別人的文章迅速熟悉以下,但是搜索水平有限,并沒有搜到合適的文章,往往都是怎么怎么弄一下,跑起來GUI形式的Hello World就完了,或者寫一堆又不不提套路,反而不如去看編排好看一點的文檔了。所以這里記錄一下,當作自己的學習筆記,也希望能幫助到需要的人。注: 以下所述運行環境都是Python2.7
先跑起來看看
很顯然,像Tk()這種函數,都是從Tkinter導入的。Tk()運行會返回一個基本窗口組件,其實就是一個對象了。然后對這個對象進行一些操作就可以改變窗口的外觀,例如綁定其他組件,改變Title什么的。最后調用mainloop方法,顧名思義,是啟動主循環,展現出窗口。另外,Tkinter是事件驅動型的,例如遇到點擊之類的事件,會進行一些反應,也就是用戶看到的所謂的操作了。
下面一點點來說,首先來看看啥是組件以及如何綁定組件,看下面的代碼:#coding: utf-8
#Date: 2016.03
#Author: Huspy blog: https://www.quarkay.com
from Tkinter import *
root = Tk()
root.title('覓而獲')
w = Label(root, text="Hello, world!")
w.pack()
root.mainloop()
可見,中間實例化了一個Label對象,在Tkinter中稱之為Label組件或者標簽組件,然后實例化的時候有一些初始化參數,例如這個組建附著在那個組建上,像label組件顧名思義,肯定要有內容,所以也得送入相關參數,這里顯然參數是命名為了text。最后相當于是搞定了組件的初始化,確認綁定到附著的組件,當然了也可以 不綁定,只不過就不會顯示了,只會存在于內存中,只有綁定上去了才會顯示。實際上,這里的所謂綁定,又和Tkinter的排版方式有關,后面細說。
這段代碼運行效果如下圖:
Tkinter使用套路小結
到這里基本上就已經清楚了,整個套路就是,先初始化一個基礎窗口組件,然后初始化其他組件比如輸入框,標簽Label,按鈕之類的,初始化好了之后在綁定在相應的窗口上,但是最終要顯示的組建肯定是一級一級的最后綁定到了基礎窗口組建上面,最后調用基礎窗口組件的mainloop方法啟動主循環,窗口就生成并且顯示了。Tkinter GUI 軟件的工作是基于事件驅動的,比如按鈕被點擊什么的,執行一些操作。最后要退出就點擊窗口的叉叉或者調用基礎窗口組件的quit()方法即可。
細說組件
在Tkinter里面有很多的組件可供選擇使用,用以完成不同的任務。這里只是說一下套路,所以挑兩個典型的用的最多的來說----Label組件和Button組件。
Label組件主要用來顯示文字或者圖片之類的,同時有著比較豐富的表現力,怎么樣放進去表現呢?顯然是在初始化的時候放進去并且設置表現方式。例如我要顯示藍色底的紅色文字,并且想要控制一下寬和高,可以這么初始化Label組件:t = Label(root, bg="blue", fg="white", text="www.mierhuo.com", width=40, height=2)
t.pack()
那么最終顯示的時候,會是這個樣子:
再比如,我想要顯示圖片,可以這樣初始化:p = PhotoImage(file="./baifeng.gif")
w = Label(root, image=p)
w.pack()
這里的PhotoImage是庫里面的一個方法,用于讀取圖片并且封裝成庫其他組件、方法可以直接利用的通用型對象。這樣實例化之后顯示的時候如下圖:
再比如Button組件,就一般軟件而言,顯然要有文字顯示,表明按鈕的作用,并且點擊之類的操作會出發一些程序動作,所以實例化的時候也是如此:# 變色功能按鈕
bt = Button(root, text="Blink", fg="green", command=Blink.changeColor)
bt.pack()
# 退出功能按鈕
bt = Button(root, text="Quit", fg="red", command=root.quit)
bt.pack()
最終顯示會是這個樣子:
可見,按鈕的表現力也還可以,還可以控制文本的顏色。所以,到這里就很清楚了,每個組件都有自己的作用,有自己獨特的展現力,另外,初始化時有些資源需要先調用其他方法封裝一下比如圖片什么的才能加以使用。庫的使用者只需要根據需要,合理使用即可。
細說Tkinter GUI布局排版方式
前面有提到,組件實例化之后是要調用pack()去綁定在父組件上面,并且一級一級最終綁定在調用mainloop()的窗口基礎組件上面。這個所謂的綁定其實就是GUI布局,或者說通過這個方式進行界面的布局排版。
在Tkinter中,有三種布局方式,分別是:Grid、Pack、Place。其中Pack前面已經出現了很多次了,就pack而言,從前面的小例子就可以看到,似乎就是從上到下依次堆疊,當然,這是因為沒有指定任何參數,默認是如此,其實pack的時候可以指定很多參數,比如對齊方式、填充方式、排布方向之類的。例如前面的例子如果pack的時候修改一下參數:t = Label(root, bg="blue", fg="white", text="www.mierhuo.com", width=40, height=2)
t.pack(fill='x')
這里順便演示一下place的效果:bt_blink = Button(root, text="Blink", fg="green", command=Blink.changeColor)
bt_blink.place(relx=0.7, rely=0.7)
最終代碼如下:#coding: utf-8
#Date: 2016.03
#Author: Huspy blog: https://www.quarkay.com
from Tkinter import *
root = Tk()
root.title('覓而獲')
t = Label(root, bg="blue", fg="white", text="www.mierhuo.com", width=40, height=2)
t.pack(fill='x')
p = PhotoImage(file="./baifeng.gif")
w = Label(root, image=p)
w.pack()
class Blink():
flag = 1
@staticmethod
def changeColor():
if Blink.flag:
t.config(fg='red', bg='green')
Blink.flag = 0
else:
t.config(fg="white", bg="blue")
Blink.flag = 1
bt_blink = Button(root, text="Blink", fg="green", command=Blink.changeColor)
bt_blink.place(relx=0.7, rely=0.7)
bt_quit = Button(root, text="Quit", fg="red", command=root.quit)
bt_quit.pack()
root.mainloop()
最終效果如下:
小結
相信到了這一步,Python Tkinter的各種套路都很清楚了,剩下的就是看文檔熟悉各種組件、布局的使用方法,然后練習練習就能上手了。然而,Tkinter的文檔似乎比較難找啊,對于合適的文檔,我剛開始也是找了很久沒找到,這里分享一下:effbot.org/tkinterbook/tkinter-index.htm#class-reference
另外,之前用Python寫過一個辣雞嗅探器,代碼寫的很辣雞,不過界面也是用Tkinter做的,有興趣的同學可以參考一下:
界面如下:
(其實大半年以前就打算寫此文了,結果就開了個頭然后一直沒動,博客也一直沒更新,真是明日復明日,明日何其多。以后一定要改掉這個壞習慣,每天堅持學習,堅持寫博客記錄,與君共勉!)