運用 Label 製作時鐘
這篇教學會使用 tkinter 的 Label 標籤,搭配標籤的文字變數應用,製作一個簡單的時鐘,最後還會搭配 Python 的 datetime 函式庫,製作出同時顯示不同時區時間的時鐘。
快速導覽:
因為 Google Colab 不支援 tkinter,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda )。
製作時鐘,顯示台灣本地時間
延伸「加入 Label 標籤」文章範例,根據下列重點撰寫時鐘的程式:
- 載入 datetime 函式庫,使用 datetime.timezone 設定時區 ( 參考 timezone )。
- 使用 tk.StringVar() 建立文字變數。
- 建立 showTime 函式:
- 使用 datetime.datetime.now 讀取目前時間,轉換成 H:M:S 格式 ( 參考 datetime )。
- 使用 set() 方法,更新 tk 文字變數內容。
- 使用 after() 方法,讓視窗每隔 1000 毫秒執行一次 showTime 函式。
- 使用 Label 方法在視窗中加入兩個 Label,第二個時間的 Lable 設定 textvariable 參數,使其能動態顯示內容。
import tkinter as tk
import datetime
GMT = datetime.timezone(datetime.timedelta(hours=8)) # 設定所在時區 ( 台灣是 GMT+8 )
root = tk.Tk() # 建立視窗物件
root.title('oxxo.studio') # 設定視窗標題
root.geometry('200x200') # 設定視窗大小
a = tk.StringVar() # 建立文字變數
# 建立不斷改變文字變數的函式
def showTime():
now = datetime.datetime.now(tz=GMT).strftime('%H:%M:%S') # 取得目前的時間,格式使用 H:M:S
a.set(now) # 設定變數內容
root.after(1000, showTime) # 視窗每隔 1000 毫秒再次執行一次 showTime()
tk.Label(root, text='目前時間', font=('Arial',20)).pack() # 放入第一個 Label 標籤
tk.Label(root, textvariable=a, font=('Arial',20)).pack() # 放入第二個 Label 標籤,內容是 a 變數
showTime() # 執行函式
root.mainloop()
世界時鐘,同時顯示不同時區時間
了解顯示時間的原理後,便可以開始設計可以同時顯示不同時區時間的「世界時鐘」,程式設計的重點如下:
- 定義 timezone 函式,負責產生不同時區的時間。
- 新增 name 和 loc_time 變數,內容是四個時區的名稱和 GMT 數字所組成的串列。
- 使用串列生成式,產生一個內容包含四個 tk 文字變數的串列。
- 修改 showTime 函式,因為有四個時區,使用 for 迴圈執行四次,並更新文字變數。
- 因為有四個時區,使用 for 迴圈執行四次,總共產生八個 Label。
import tkinter as tk
import datetime
# 定義產生不同時區時間的函式
def timezone(h):
GMT = datetime.timezone(datetime.timedelta(hours=h)) # 取得時區
now = datetime.datetime.now(tz=GMT).strftime('%H:%M:%S') # 取得該時區的時間
return now
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x300')
name = ['倫敦','台灣','日本','紐約'] # 四個時區的名稱串列
loc_time = [1,8,9,-4] # 四個時區的 GMT 數字
arr = [tk.StringVar() for i in range(4)] # 使用串列生成式,產生一個內容包含四個 tk 文字變數的串列
# 定義顯示時間的函式
def showTime():
# 因為有四個時區,使用 for 迴圈執行四次
for i in range(4):
arr[i].set(timezone(loc_time[i])) # 設定文字變數
root.after(1000, showTime) # 視窗每隔 1000 毫秒再次執行一次 showTime()
# 因為有四個時區,使用 for 迴圈執行四次
for i in range(4):
# 依序加入不同時區的名稱與時間
tk.Label(root, text=name[i], font=('Arial',20)).pack()
tk.Label(root, textvariable=arr[i], font=('Arial',20)).pack()
showTime()
root.mainloop()
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~