TShopping

 找回密碼
 註冊
搜索
查看: 142|回復: 0

[教學] Python Tkinter 製作 GUI 圖形化介面教學

[複製鏈接]
發表於 2020-10-25 21:22:04 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk  
前言
除了 Web 和 Mobile App 之外,桌面應用程式(Desktop Application)也是使用者常使用的應用程式圖形化使用者介面(GUI)。透過 GUI 可以讓一般使用者透過比較直覺的方式來和程式互動(畢竟要讓一般的使用者使用 Command Line 來操作程式是挺難的),也可以讓整個使用者行為更為簡便。許多程式語言都有提供 GUI 的函式庫,讓開發者可以透過常見的元件,例如:按鈕、文字方塊、下拉式選單等方式來設計整個應用程式。在這裡,我們將使用 Python 內建的 Tkinter 函式庫來建立一個簡單的 BMI 計算應用程式,讓讀者感受一下 Python Tkinter 設計桌面應用程式的流程。

Tkinter 函式庫簡介
基本設計流程
撰寫 Tkinter GUI 程式主要會有以下三個步驟:
  • 建立主視窗(設定視窗大小、位置和視窗名稱)
  • 將元件(如:按鈕、文字方塊、選單等)放入視窗中
  • 實作事件處理函式,當作使用者互動時的事件處理器(event handler)。例如:當使用者點擊某個按鈕時要觸發什麼行為。

以下是簡單的範例程式,建立主視窗後加入 3+1 個按鈕元件,當點擊下方按鈕元件時,事件處理器會印出 hello world :)
  1. # 引入套件
  2. import tkinter as tk

  3. # 建立主視窗和 Frame(把元件變成群組的容器)
  4. window = tk.Tk()
  5. top_frame = tk.Frame(window)

  6. # 將元件分為 top/bottom 兩群並加入主視窗
  7. top_frame.pack()
  8. bottom_frame = tk.Frame(window)
  9. bottom_frame.pack(side=tk.BOTTOM)

  10. # 建立事件處理函式(event handler),透過元件 command 參數存取
  11. def echo_hello():
  12.     print('hello world :)')

  13. # 以下為 top 群組
  14. left_button = tk.Button(top_frame, text='Red', fg='red')
  15. # 讓系統自動擺放元件,預設為由上而下(靠左)
  16. left_button.pack(side=tk.LEFT)

  17. middle_button = tk.Button(top_frame, text='Green', fg='green')
  18. middle_button.pack(side=tk.LEFT)

  19. right_button = tk.Button(top_frame, text='Blue', fg='blue')
  20. right_button.pack(side=tk.LEFT)

  21. # 以下為 bottom 群組
  22. # bottom_button 綁定 echo_hello 事件處理,點擊該按鈕會印出 hello world :)
  23. bottom_button = tk.Button(bottom_frame, text='Black', fg='black', command=echo_hello)
  24. # 讓系統自動擺放元件(靠下方)
  25. bottom_button.pack(side=tk.BOTTOM)

  26. # 運行主程式
  27. window.mainloop()
複製代碼

觀看成果:

Python Tkinter GUI 圖形化介面 教學

Python Tkinter  GUI  圖形化介面 教學


建立 BMI App 主視窗
在建立我們的應用程式前,我們先簡單使用繪製我們介面的 mockup 圖:

Python Tkinter GUI 圖形化介面 教學

Python Tkinter  GUI  圖形化介面 教學
整個應用程式流程如下:
  • 提供輸入框讓使用者可以輸入其身高(m)、體重(kg)
  • 點擊馬上計算按鈕後計算 BMI 指數
  • 顯示結果於畫面上

  1. import tkinter as tk

  2. window = tk.Tk()
  3. # 設定視窗標題、大小和背景顏色
  4. window.title('BMI App')
  5. window.geometry('800x600')
  6. window.configure(background='white')

  7. # 運行主程式
  8. window.mainloop()
複製代碼

成果如下:

Python Tkinter GUI 圖形化介面 教學

Python Tkinter  GUI  圖形化介面 教學


建立 BMI App 元件
建立完主視窗後,接下來我們來把元件一一加入到主視窗,我們元件主要分成三大部分:
  • 標題顯示 BMI 計算器 文字區塊
  • 身高體重輸入區塊
  • 顯示結果和點擊按鈕

  1. import tkinter as tk

  2. window = tk.Tk()
  3. window.title('BMI App')
  4. window.geometry('800x600')
  5. window.configure(background='white')

  6. header_label = tk.Label(window, text='BMI 計算器')
  7. header_label.pack()

  8. # 以下為 height_frame 群組
  9. height_frame = tk.Frame(window)
  10. # 向上對齊父元件
  11. height_frame.pack(side=tk.TOP)
  12. height_label = tk.Label(height_frame, text='身高(m)')
  13. height_label.pack(side=tk.LEFT)
  14. height_entry = tk.Entry(height_frame)
  15. height_entry.pack(side=tk.LEFT)

  16. # 以下為 weight_frame 群組
  17. weight_frame = tk.Frame(window)
  18. weight_frame.pack(side=tk.TOP)
  19. weight_label = tk.Label(weight_frame, text='體重(kg)')
  20. weight_label.pack(side=tk.LEFT)
  21. weight_entry = tk.Entry(weight_frame)
  22. weight_entry.pack(side=tk.LEFT)

  23. result_label = tk.Label(window)
  24. result_label.pack()

  25. calculate_btn = tk.Button(window, text='馬上計算')
  26. calculate_btn.pack()

  27. window.mainloop()
複製代碼

成果:

Python Tkinter GUI 圖形化介面 教學

Python Tkinter  GUI  圖形化介面 教學


建立 BMI App 事件處理
加入元件後我們可以建立
  1. def calculate_bmi_number():
  2.     height = float(height_entry.get())
  3.     weight = float(weight_entry.get())
  4.     bmi_value = round(weight / math.pow(height, 2), 2)
  5.     result = '你的 BMI 指數為:{} {}'.format(bmi_value, get_bmi_status_description(bmi_value))
  6.     # 將計算結果更新到 result_label 文字內容
  7.     result_label.configure(text=result)

  8. def get_bmi_status_description(bmi_value):
  9.     if bmi_value < 18.5:
  10.         return '體重過輕囉,多吃點!'
  11.     elif bmi_value >= 18.5 and bmi_value < 24:
  12.         return '體重剛剛好,繼續保持!'
  13.     elif bmi_value >= 24 :
  14.         return '體重有點過重囉,少吃多運動!'
複製代碼

透過 command 參數可以將 calculate_bmi_number 事件處理函式綁定到元件上
  1. calculate_btn = tk.Button(window, text='馬上計算', command=calculate_bmi_number)
複製代碼

完整程式碼:
  1. import tkinter as tk
  2. import math

  3. window = tk.Tk()
  4. window.title('BMI App')
  5. window.geometry('800x600')
  6. window.configure(background='white')

  7. def calculate_bmi_number():
  8.     height = float(height_entry.get())
  9.     weight = float(weight_entry.get())
  10.     bmi_value = round(weight / math.pow(height, 2), 2)
  11.     result = '你的 BMI 指數為:{} {}'.format(bmi_value, get_bmi_status_description(bmi_value))
  12.     result_label.configure(text=result)

  13. def get_bmi_status_description(bmi_value):
  14.     if bmi_value < 18.5:
  15.         return '體重過輕囉,多吃點!'
  16.     elif bmi_value >= 18.5 and bmi_value < 24:
  17.         return '體重剛剛好,繼續保持!'
  18.     elif bmi_value >= 24 :
  19.         return '體重有點過重囉,少吃多運動!'

  20. header_label = tk.Label(window, text='BMI 計算器')
  21. header_label.pack()

  22. height_frame = tk.Frame(window)
  23. height_frame.pack(side=tk.TOP)
  24. height_label = tk.Label(height_frame, text='身高(m)')
  25. height_label.pack(side=tk.LEFT)
  26. height_entry = tk.Entry(height_frame)
  27. height_entry.pack(side=tk.LEFT)

  28. weight_frame = tk.Frame(window)
  29. weight_frame.pack(side=tk.TOP)
  30. weight_label = tk.Label(weight_frame, text='體重(kg)')
  31. weight_label.pack(side=tk.LEFT)
  32. weight_entry = tk.Entry(weight_frame)
  33. weight_entry.pack(side=tk.LEFT)

  34. result_label = tk.Label(window)
  35. result_label.pack()

  36. calculate_btn = tk.Button(window, text='馬上計算', command=calculate_bmi_number)
  37. calculate_btn.pack()

  38. window.mainloop()
複製代碼

最後成果:

Python Tkinter GUI 圖形化介面 教學

Python Tkinter  GUI  圖形化介面 教學


總結
以上透過 Python 內建的 Tkinter 函式庫來建立一個簡單的 BMI 計算應用程式,讓讀者感受一下 Python Tkinter 設計桌面應用程式的流程。事實上,Tkinter 支援物件導向撰寫方式,我們也可以將以上程式碼重構成物件導向撰寫方式。比起 CLI 來說 GUI 對於一般使用者在使用上確實是比較方便,若有興趣的讀者也可以自己嘗試製作小遊戲或是更多有趣的不同應用。
參考文件
網頁設計,網站架設 ,網路行銷,網頁優化,SEO - NetYea 網頁設計

 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2020-11-30 12:30 , Processed in 0.066063 second(s), 24 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表