此篇目標:
- 知道甚麼是 root
- 建立最基本的視窗
- 知道有那些常用方法
目錄:
- 甚麼是 root
- 啟動視窗
- root 常用的方法
甚麼是 root
root 就是視窗和容器,也是一切物件的源頭,除了 root 以外的物件,通常稱為 widget (中文會翻譯成工具),後面會以 widget 代表其它可用的工具。
除了 root,還有其它可以作為容器的 widget,這部分會在後面講述。
啟動視窗
底下是啟動視窗的陽春程式碼
# 範例皆在 Python 3 的環境下運作
# 一般會習慣修改 tkinter 的別名,變成 tk
import tkinter as tk
# 建立 root,也就是視窗,有些網站會使用 window 或其它名字
root = tk.Tk()
# 啟動 root,讓 root 維持在無窮迴圈,這樣視窗才不會自動關閉
# 少了這個,視窗會啟動後馬上關閉
root.mainloop()
root 常用的方法
完整的功能和屬性可參考 wm manual page — Tk Built-In Commands (tcl.tk)
- title
- geometry
- resizable
- columnconfigure,rowconfigure
- minsize, maxsize
- after
- deiconify, iconify
- withdraw
- lift, lower
- iconbitmap
- winfo_
- attribute-alpha
- attribute-disabled
- attribute-fullscreen
- attribute-toolwindow
- attribute-topmost
title 標題
視窗左上角的標題,預設是 tk。
import tkinter as tk
root = tk.Tk()
root.title('New Title')
root.mainloop()
geometry 視窗預設大小
預設 tk 開啟後是長寬各 200 pixel,用這個功能可以變更預設大小。
geometry 同時還可以控制 視窗邊寬和物件之間的距離,間距。
如果沒有設定 geometry,視窗會依照內容物自動放大,如果內容物太小,會使用預設的 200x200。
間距的實際說明會放在後面的 geometry managers。
輸入的格式為 root.geometry('寬x高±X軸間距±Y軸間距')
,可以只輸入前兩個寬高,省略間距的部分。
間距的部分,很適合依次拿來調整 widget 與視窗邊界的距離。
import tkinter as tk
root = tk.Tk()
root.title('Geometry')
root.geometry('300x100') # 寬 300 pixel,高 100 pixel
root.mainloop()
# 此項目因與上面很相識,便不顯示截圖
resizable 是否可調整視窗大小
輸入的格式為 root.resizable(是否可調整寬, 是否可調整高)
,兩個參數都是 bool 值,適合用在排版精細,不希望使用者自行改變視窗大小。
預設寬高都是 True,兩邊都可以調整大小。
import tkinter as tk
root = tk.Tk()
root.title('Resizable')
root.geometry('300x100')
root.resizable(True, False) # 可調整寬,不可調整高
root.mainloop()
# 此項目因與上面很相識,便不顯示截圖
columnconfigure,rowconfigure
用在 grid 排版上,當視窗大小變更時,要怎麼改變 grid 排版的欄位大小。
會在 grid 詳細描述。
minsize, maxsize
視窗可調整的最小和最大值,單位 pixel。
用在調整視窗大小時,限制可調整的幅度。
輸入的格式都是 minsize(寬, 高)
import tkinter as tk
root = tk.Tk()
root.title('MinMax')
root.geometry('300x100')
root.minsize(200, 50) # 最小的寬 200, 高 50
root.maxsize(400, 200) # 最大的寬 400, 高 200
root.mainloop()
# 此項目因與上面很相識,便不顯示截圖
after 過多久後執行指令
類似排程功能,在指定的時間過後執行一個 function
輸入的格式為 root.after(毫秒, func名稱)
import tkinter as tk
root = tk.Tk()
root.title('After')
root.after(1000, lambda: print('1'))
root.after(2000, lambda: print('2'))
root.after(3000, lambda: print('3'))
root.mainloop()
deiconify, iconify
最小化和還原
iconify 最小化,類似按下 windows 視窗的 Minimize 按鈕。
deiconify 還原,從最小化的狀態還原。
import tkinter as tk
root = tk.Tk()
# 開啟視窗後第三秒縮小
# 第六秒還原
root.after(3000, root.iconify)
root.after(6000, root.deiconify)
root.mainloop()
withdraw
整個視窗消失,連底下工作列都不見,但程式仍在背景執行。
import tkinter as tk
root = tk.Tk()
# 開啟視窗後第三秒視窗消失
# 第六秒還原
root.after(3000, root.withdraw)
root.after(6000, root.deiconify)
root.mainloop()
raise, lower
- raise,視窗的 z index 往上調整,意思是可以蓋在其它視窗前
- lower,視窗的 z index 往下調整,會被其它視窗覆蓋
iconbitmap
更換視窗左上角的小圖
import tkinter as tk
root = tk.Tk()
root.geometry("400x300+50+50")
# 圖檔必須是 ico 格式,不然會出現檔案 not defined 錯誤訊息
root.iconbitmap('3045396.ico')
root.mainloop()
winfo_
取得視窗或 widget 的大小,通常用在排版
- winfo_height(),物件實際使用的高度,單位 pixel。
- winfo_width(),物件實際使用的寬度。
- winfo_reqheight(),物件請求的高度
- winfo_reqwidth(),物件請求的寬度
- winfo_screenheight(),電腦螢幕解析度的高,單位 pixel。
- winfo_screenwidth(),電腦螢幕解析度的寬。
# 視窗開啟後會在螢幕正中間
# 網路蠻多這個範例的
import tkinter as tk
root = tk.Tk()
window_h = 300
window_w = 400
scr_h = root.winfo_screenheight()
scr_w = root.winfo_screenwidth()
x = int((scr_w - window_w) / 2)
y = int((scr_h - window_h) / 2)
root.geometry(f"400x300+{x}+{y}")
root.mainloop()
attribute
視窗的屬性,並非每個作業系統都支援
屬性的名稱和值的中間要加一個 , ,如 attributes('-alpha', '0.5')
- -alpha 半透明
import tkinter as tk
root = tk.Tk()
# 值在 1.0 到 0.0 之間。
# 1.0 不透明,0.0 完全透明(看不到)
root.attributes("-alpha","0.5")
root.mainloop()
- -disabled 禁止使用視窗
import tkinter as tk
root = tk.Tk()
# 值為 1 (禁用) 或 0 (可使用)
# 禁用狀態下,要關閉視窗要使用工作管理員才能關閉
root.attributes("-disabled","1")
# 3 秒後解除禁用
root.after(3000,root.attributes,"-disabled","0")
root.mainloop()
- -fullscreen 全螢幕
import tkinter as tk
root = tk.Tk()
# 值為 1 (全螢幕)
# 全螢幕狀態下不會顯示右上角的 縮小 放大 關閉 的按鈕
root.attributes("-fullscreen","1")
root.mainloop()
- -toolwindow 工具模式
import tkinter as tk
root = tk.Tk()
# 工具模式沒有最小化和最大化按鈕
# 值為 1 (工具視窗)
root.attributes("-toolwindow","1")
root.mainloop()
- -topmost
視窗永遠在最上層,不會被其它視窗蓋住
import tkinter as tk
root = tk.Tk()
# 值為 1 (最上層)
root.attributes("-topmost","1")
root.mainloop()