Tkinter介紹
官方用的GUI工具包——Tkinter(IDLE就是用這個開發的)。
Tkinter是Python的標準GUI庫,它實際是建立在Tk技術上的。在大多數Unix平臺以及Windows系統上都可用。
作為 python 特定的GUI介面,是一個影像的視窗,tkinter是python 自帶的,可以編輯的GUI介面,我們可以用GUI 實現很多直觀的功能,比如想開發一個計算器,如果只是一個鍵盤輸入,輸出的黑色視窗,是沒用使用者體驗的。所有開發一個影像化的小視窗,就是必要的。
對於稍有GUI程式設計經驗的人來說,Python的Tkinter介面庫是非常簡單的。python的GUI庫非常多,選擇Tkinter,一是最為簡單,二是自帶庫,不需下載安裝,隨時使用,三則是從需求出發,Python作為一種指令碼語言,或者說一種膠水語言,一般不會用它來開發複雜的桌面應用,它並不具備這方面的優勢,使用Python,可以把它作為一個靈活的工具,而不是作為主要開發語言,那麼在工作中,需要製作一個小工具,肯定是需要有介面的,不僅自己用,也能分享別人使用,在這種需求下,Tkinter是足夠勝任的!
Tkinter是Python預設的GUI庫,像IDLE就是用Tkinter設計出來的,因此直接匯入Tkinter模組就可以了:
import tkinter
Tkinter之初體驗
接下來從最簡單的例子入手:
import tkinter as tk
# 建立一個主視窗,用於容納整個GUI程式
root = tk.Tk()
# 設定主視窗物件的標題欄
root.title("First Demo")
# 設定視窗大小
root.geometry('500x300+100+100')
# 新增一個Label元件,Label元件是GUI程式中最常用的元件之一。
# Label元件可以顯示文字、圖示或者圖片
# 在這裡我們讓它顯示指定文字
theLabel = tk.Label(root, text="我的第一個tkinter視窗!")
# 然後呼叫Label元件的pack()方法,用於自動調節元件自身的尺寸
theLabel.pack()
# 注意,這時候視窗還是不會顯示的…
# 除非執行下面這條程式碼!
root.mainloop()
執行程式,如圖所示。
loop因為是迴圈的意思,root.mainloop就會讓root不斷的重新整理,如果沒有mainloop,就是一個靜態的root,傳入進去的值就不會有迴圈,mainloop就相當於一個很大的while迴圈,有個while,每點選一次就會更新一次,所以我們必須要有迴圈。
所有的視窗檔案都必須有類似的mainloop函式,mainloop是視窗檔案的關鍵的關鍵。
意思是一旦進入了主事件迴圈,就由Tkinter掌管一切了。現在不理解沒關係,在後面的學習中你會有深刻的體會。GUI程式的開發與以往的開發經驗會有截然不同的感受。
通常如果要寫一個比較大的程式,那麼應該先把程式碼給封裝起來。在物件導向的程式語言中,就是封裝成類。看下面進階版的例子:
import tkinter as tk
def create_button(root):
# 建立一個按鈕元件
# fg 是 foreground 的縮寫, 就是設定前景色的意思
say_hello = tk.Button(root, text='打招呼', fg='blue', command=eat)
say_hello.pack()
return root
def eat():
print('今天你吃飯了嗎?')
root = tk.Tk()
app = create_button(root)
root.mainloop()
程式跑起來後出現一個“打招呼”按鈕,單擊它就能從IDLE接收到回饋資訊,如圖15-3所示。
視窗的管理與設定
不知道大家是否注意到了,上述舉例的簡單demo程式存在視窗顯示混亂的情況,這樣的一個介面顯然是不符合我們要求的。所以我們首先要開始學習如何使用tkinter去控制我們的視窗
基本屬性設定
1.新增標題
# 設定視窗標題
root.title("title")
2.新增圖示
# 設定圖示,以OneDrive圖示為例,必須是以 .ico 為字尾的圖示檔案,放於同目錄下。
root.iconbitmap("OneDrive.ico")
3.設定背景
# 設定背景色,可以用英文名,也可以用十六進位制表示的顏色。
root["background"] = "#00ffff"
完整程式碼
# 匯入模組,取別名
import tkinter as tk
# 例項化一個窗體物件
root = tk.Tk()
# 設定視窗的大小長寬為300x300出現的位置距離視窗左上角+150+150
root.geometry("300x300+150+150")
# 設定視窗標題
root.title("title")
# 設定圖示,以OneDrive圖示為例,必須是以 .ico 為字尾的圖示檔案,放於同目錄下。
root.iconbitmap("OneDrive.ico")
# 設定背景色,可以用英文名,也可以用十六進位制表示的顏色。
root["background"] = "#00ffff"
# 進入訊息迴圈,顯示視窗
root.mainloop()
效果演示
外形設定
1.設定透明度
# 透明度的值:0~1 也可以是小數點,0:全透明;1:全不透明
root.attributes("-alpha", 0.6)
2.設定工具欄樣式
# True 只有退出按鈕,也沒有圖示;False 正常的窗體樣式
root.attributes("-toolwindow", True)
效果演示
3.設定全屏
# True 全屏;False 正常顯示
root.attributes("-fullscreen", True)
4.視窗置頂
# True 所有視窗中處於最頂層;False 正常顯示 兩個同時被置頂的視窗為同級(能互相遮蓋),但他們都能同時遮蓋住沒有被設定為置頂的視窗。
root.attributes("-topmost", True)
5.設定成脫離工具欄
# True 沒有工具欄按鈕;False 正常顯示
root.overrideredirect(True)
完整程式碼
# 匯入模組,取別名
import tkinter as tk
# 例項化一個窗體物件
root = tk.Tk()
# 設定視窗的大小長寬為300x300出現的位置距離視窗左上角+150+150
root.geometry("300x300+150+150")
# 設定視窗標題
root.title("title")
# 設定圖示,以OneDrive圖示為例,必須是以 .ico 為字尾的圖示檔案,放於同目錄下。
root.iconbitmap("OneDrive.ico")
# 設定背景色,可以用英文名,也可以用十六進位制表示的顏色。
root["background"] = "#00ffff"
# True 全屏;False 正常顯示
root.attributes("-fullscreen", True)
# True 所有視窗中處於最頂層;False 正常顯示 兩個同時被置頂的視窗為同級(能互相遮蓋),但他們都能同時遮蓋住沒有被設定為置頂的視窗。
root.attributes("-topmost", True)
# True 沒有工具欄按鈕;False 正常顯示
root.overrideredirect(True)
# 進入訊息迴圈,顯示視窗
root.mainloop()
窗體的方法
1.獲取螢幕大小
screenheight = root.winfo_screenheight()
screenwidth = root.winfo_screenwidth()
完整程式碼
# 匯入模組,取別名
import tkinter as tk
# 例項化一個窗體物件
root = tk.Tk()
# 獲取螢幕大小
screenheight = root.winfo_screenheight()
screenwidth = root.winfo_screenwidth()
print("螢幕高度:", screenheight)
print("螢幕寬度:", screenwidth)
rootwidth = 300
roothight = 300
# 設定視窗在螢幕居中
root.geometry("%dx%d+%d+%d" % (rootwidth, roothight, (screenwidth-rootwidth)/2, (screenheight-roothight)/2))
# 進入訊息迴圈,顯示視窗
root.mainloop()
演示效果
2.獲取窗體位置
root_x = root.winfo_x()
root_y = root.winfo_y()
3.獲取窗體大小
root_height = root.winfo_height()
root_width = root.winfo_width()
完整程式碼
# 匯入模組,取別名
import tkinter as tk
# 例項化一個窗體物件
root = tk.Tk()
# 設定窗體高寬和位置
root.geometry("600x500+150+150")
# 更新窗體
root.update()
# 獲取窗體位置
root_x = root.winfo_x()
root_y = root.winfo_y()
# 獲取窗體大小
root_height = root.winfo_height()
root_width = root.winfo_width()
# 輸出窗體位置和窗體高寬
print(root_x)
print(root_y)
print(root_width)
print(root_y)
# 進入訊息迴圈,顯示視窗
root.mainloop()
演示效果