1. 程式人生 > 其它 >python程式互動介面之GUI窗體程式 Tkinter

python程式互動介面之GUI窗體程式 Tkinter

關於Tkinter

Tkinter 模組(Tk 介面)是 Python 的標準 Tk GUI 工具包的介面 .Tk 和 Tkinter 可以在大多數的 Unix 平臺下使用,同樣可以應用在 Windows 和 Macintosh 系統裡。Tk8.0 的後續版本可以實現本地視窗風格,並良好地執行在絕大多數平臺中。

Tkinter模組("Tk 介面")是Python的標準Tk GUI工具包的介面。作為python 特定的GUI介面,是一個影象的視窗,tkinter是python 自帶的,可以編輯的GUI介面,我們可以用GUI 實現很多直觀的功能,比如想開發一個計算器,如果只是一個程式輸入,輸出視窗的話,是沒用使用者體驗的。所有開發一個影象化的小視窗,就是必要的。

對於稍有GUI程式設計經驗的人來說,Python的Tkinter介面庫是非常簡單的。python的GUI庫非常多,選擇Tkinter,一是最為簡單,二是自帶庫,不需下載安裝,隨時使用,三則是從需求出發,Python作為一種指令碼語言,一種膠水語言,一般不會用它來開發複雜的桌面應用,它並不具備這方面的優勢,使用Python,可以把它作為一個靈活的工具,而不是作為主要開發語言,那麼在工作中,需要製作一個小工具,肯定是需要有介面的,不僅自己用,也能分享別人使用,在這種需求下,Tkinter是足夠勝任的!

Tkinter 程式設計

Tkinter 是 Python 的標準 GUI 庫。Python 使用 Tkinter 可以快速的建立 GUI 應用程式。

由於 Tkinter 是內建到 python 的安裝包中、只要安裝好 Python 之後就能 import Tkinter 庫、而且 IDLE 也是用 Tkinter 編寫而成、對於簡單的圖形介面 Tkinter 還是能應付自如。

import tkinter

Tkinter 元件

Tkinter的提供各種控制元件,如按鈕,標籤和文字框,一個GUI應用程式中使用。這些控制元件通常被稱為控制元件或者部件。

目前有15種Tkinter的部件。我們提出這些部件以及一個簡短的介紹,在下面的表:

控制元件描述
Button 按鈕控制元件;在程式中顯示按鈕。
Canvas 畫布控制元件;顯示圖形元素如線條或文字
Checkbutton 多選框控制元件;用於在程式中提供多項選擇框
Entry 輸入控制元件;用於顯示簡單的文字內容
Frame 框架控制元件;在螢幕上顯示一個矩形區域,多用來作為容器
Label 標籤控制元件;可以顯示文字和點陣圖
Listbox 列表框控制元件;在Listbox視窗小部件是用來顯示一個字串列表給使用者
Menubutton 選單按鈕控制元件,用於顯示選單項。
Menu 選單控制元件;顯示選單欄,下拉選單和彈出選單
Message 訊息控制元件;用來顯示多行文字,與label比較類似
Radiobutton 單選按鈕控制元件;顯示一個單選的按鈕狀態
Scale 範圍控制元件;顯示一個數值刻度,為輸出限定範圍的數字區間
Scrollbar 滾動條控制元件,當內容超過視覺化區域時使用,如列表框。.
Text 文字控制元件;用於顯示多行文字
Toplevel 容器控制元件;用來提供一個單獨的對話方塊,和Frame比較類似
Spinbox 輸入控制元件;與Entry類似,但是可以指定輸入範圍值
PanedWindow PanedWindow是一個窗口布局管理的外掛,可以包含一個或者多個子控制元件。
LabelFrame labelframe 是一個簡單的容器控制元件。常用與複雜的窗口布局。
tkMessageBox 用於顯示你應用程式的訊息框。

標準屬性

標準屬性也就是所有控制元件的共同屬性,如大小,字型和顏色等等。

屬性 描述
Dimension 控制元件大小;
Color 控制元件顏色;
Font 控制元件字型;
Anchor 錨點;
Relief 控制元件樣式;
Bitmap 點陣圖;
Cursor 游標;

實踐:製作一個BMI 計算器GUI程式

編寫一個簡單的介面,使用者輸入體重、身高,點選計算按鈕,生成身體質量指數,簡稱體質數

示例程式碼

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import tkinter as tk
from tkinter import ttk # 主體控制元件命名模組


class BMIView(tk.Frame):
    def __init__(self,parent,*args,**kwargs):
        super().__init__(parent,*args,**kwargs) # parent 指的是當前這個控制元件容器將會依附在哪個容器或者窗體之上
        self.body_weight = tk.DoubleVar()
        self.height = tk.DoubleVar()
        self.bmi = tk.StringVar()

        lbl_body_weight = ttk.Label(self,text="體重(Kg):")
        entry_body_weight = ttk.Entry(self,textvariable=self.body_weight)

        lbl_height = ttk.Label(self,text="身高(m):")
        entry_height = ttk.Entry(self,textvariable=self.height)

        btn_calculate = ttk.Button(self,text="計算",command=self.on_calculate)
        lbl_bmi = ttk.Label(self,textvariable=self.bmi,font=("Microsoft Yahei",64),wraplength=480)

        lbl_body_weight.grid(row=0,column=0,sticky=tk.W)
        entry_body_weight.grid(row=0,column=1,sticky=(tk.W+tk.E))
        lbl_height.grid(row=0,column=2,sticky=(tk.W+tk.E))
        entry_height.grid(row=0,column=3,sticky=(tk.W+tk.E))
        btn_calculate.grid(row=0,column=4,sticky=(tk.E))
        lbl_bmi.grid(row=1,column=0,columnspan=5) # columnspan=5 合併5個單元格

        self.columnconfigure(1,weight=1)
        self.columnconfigure(3,weight=1)


    def on_calculate(self):
        bmi = self.body_weight.get() / (self.height.get() ** 2)
        print('bmi:',bmi)
        self.bmi.set(f"{bmi:.1f}")


class BMIApplication(tk.Tk):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.title("BMI 計算器")
        self.geometry("640x180")
        self.resizable(width=False,height=False)

        BMIView(self).grid(sticky=(tk.E+tk.N+tk.W+tk.S))

        self.columnconfigure(0,weight=1)


if __name__ == '__main__':
    app = BMIApplication()
    app.mainloop()

測試功能: