Python 速查手冊

12.9 圖形介面 tkinter

本書已有新版,請參考 Python 簡易手冊 - 目錄

tkinter 為 Python 內建的 GUI 程式庫 (library) ,基本使用順序如下

  1. 建立 Tk 物件, Tk 物件是視窗應用程式。
  2. 建立 Frame 物件, Frame 是基本的視窗。
  3. 建立所需的視窗元件物件,再利用 pack() 或 grid() 方法設定視窗元件如何在視窗上顯示。
  4. Tk 物件呼叫 mainloop() 方法,維持視窗在螢幕上顯示。

tkinter 有以下的視窗元件

類別說明
Button按鈕。
Canvas長方形區域。
Checkbutton核取按鈕。
Entry文字輸入欄。
Frame視窗。
Label文字標籤。
LabelFrame文字標籤視窗。
Listbox列表選單。
Menu選單列的下拉式選單。
MenuButton選單的選項。
Message類似 Label ,可多行。
OptionMenu下拉式的選項選單。
PaneWindow類似 Frame ,可包含其他視窗元件。
Radiobutton單選按鈕。
Scale拉桿。
Scrollbar捲軸。
Spinbox微調器
Text文字方塊。
Toplevel新增視窗。

每一種視窗元件都有為數不等的屬性可詳細設定,實際的程式範例比較容易理解使用方式,例如以下程式為基本使用

from tkinter import *

root = Tk()
app = Frame(root)
hello = Label(root, text="Hello Tk!", width="30", height="5")
hello.pack()
root.mainloop()

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:tkdemo01.py
# 功能:示範 tkinter 模組
# 作者:張凱慶

這個視窗只有一個 Label ,所有屬性 (attribute) 直接在 Label 的建構子 (constructor) 中設定

hello = Label(root, text="Hello Tk!", width="30", height="5")

text 是文字標籤中的文字, width 是寬度,單位是字元數, height 是高度,單位是行數。

於命令列執行以上程式

$ python3 tkdemo01.py

會出現如下視窗

以下程式為自訂類別 (class) 繼承 ttk 的 Frame ,再用 showinfo 顯示訊息

import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo

class Application(ttk.Frame):
    def __init__(self, master):
        ttk.Frame.__init__(self, master)
        self.pack()

        self.button = ttk.Button(self)
        self.button["text"] = "Click Me!"
        self.button["command"] = self.popup_hello
        self.button.pack()
    
    def popup_hello(self):
        showinfo("Hello", "Hello Tk!")

root = tk.Tk()
app = Application(root)
root.mainloop()

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:tkdemo02.py
# 功能:示範 tkinter 模組
# 作者:張凱慶
ttk 是 tkinter 另外一組視窗元件的程式庫, ttk 可替視窗元件設定不同的樣式。

注意建立 button 後,相關屬性是用字典 (dictionary) 的方式設定

self.button = ttk.Button(self)
self.button["text"] = "Click Me!"
self.button["command"] = self.popup_hello
self.button.pack()

其中 command 為按下按鈕執行的方法。

於命令列執行以上程式

$ python3 tkdemo02.py

會出現如下視窗

按下按鈕會再出現訊息視窗

以下程式示範多種視窗元件的外觀

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.grid()
        self.createWidgets()
    
    def createWidgets(self):
        self.button = tk.Button(self)
        self.button["text"] = "demo"
        self.button.grid(row=0, column=0, sticky=tk.N+tk.W)
        
        self.checkbutton = tk.Checkbutton(self)
        self.checkbutton["text"] = "demo"
        self.checkbutton.grid(row=1, column=0, sticky=tk.N+tk.W)
        
        self.entry = tk.Entry(self)
        self.entry.grid(row=2, column=0, sticky=tk.N+tk.W)
        
        self.label = tk.Label(self)
        self.label["text"] = "demo"
        self.label.grid(row=3, column=0, sticky=tk.N+tk.W)
                
        self.listbox = tk.Listbox(self)
        self.listbox["height"] = 5
        self.listbox.insert(1, "Python")
        self.listbox.insert(2, "Java")
        self.listbox.insert(3, "Swift")
        self.listbox.insert(4, "JavaScript")
        self.listbox.insert(5, "C")
        self.listbox.grid(row=4, column=0, sticky=tk.N+tk.W)
        
        self.optionList = ("Python", "Java", "Swift")
        self.v = tk.StringVar()
        self.v.set("demo")
        self.optionmenu = tk.OptionMenu(self, self.v, *self.optionList)
        self.optionmenu.grid(row=5, column=0, sticky=tk.N+tk.W)
        
        self.radiobutton = tk.Radiobutton(self)
        self.radiobutton["text"] = "demo"
        self.radiobutton.grid(row=6, column=0, sticky=tk.N+tk.W)
        
        self.scale = tk.Scale(self)
        self.scale.grid(row=7, column=0, sticky=tk.N+tk.W)
        
        self.spinbox = tk.Spinbox(self, from_=0, to=10)
        self.spinbox.grid(row=8, column=0, sticky=tk.N+tk.W)
        
        self.text = tk.Text(self)
        self.text["height"] = 10
        self.text["width"] = 50
        self.text.grid(row=9, column=0, sticky=tk.N+tk.W)
                
root = tk.Tk()
app = Application(root)
root.mainloop()

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:tkdemo03.py
# 功能:示範 tkinter 模組
# 作者:張凱慶

於命令列執行以上程式

$ python3 tkdemo03.py

會出現如下視窗

相關教學影片

上一頁: 12.8 伺服器 http.server
Python 速查手冊 - 目錄
下一頁: 12.10 發展工具 2to3 pydoc unittest
回 Python 教材首頁
回程式語言教材首頁