Python 速查手冊

12.9 圖形介面 tkinter

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) 繼承 ttkFrame ,再用 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 模組
# 作者:張凱慶
ttktkinter 另外一組視窗元件的程式庫, 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 教材首頁