Python tk — root,widget(2)

大軒軒
9 min readMar 25, 2024

--

tkinter 的一切源頭是一個叫做 root (或叫做 window) 的物件,是其它物件的頂層,其它的物件通通叫做 widget。

因此整個 tk 可依照物件的關聯畫出一棵大樹,樹的源頭就是 root。

此篇目標:

  • 知道甚麼是 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()
simple window
simple window

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()
change window title
change window title

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()
icon

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()
Normal and tool mode
Normal and tool mode
  • -topmost

視窗永遠在最上層,不會被其它視窗蓋住

import tkinter as tk

root = tk.Tk()

# 值為 1 (最上層)
root.attributes("-topmost","1")

root.mainloop()

--

--