tkinter 為 Python 內建的 GUI 程式庫 (library) ,基本使用順序如下
- 建立 Tk 物件, Tk 物件是視窗應用程式。
- 建立 Frame 物件, Frame 是基本的視窗。
- 建立所需的視窗元件物件,再利用 pack() 或 grid() 方法設定視窗元件如何在視窗上顯示。
- 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 |
會出現如下視窗
相關教學影片
- Python 標準程式庫的 圖形介面 Tk - tkinter ⇨ YouTube 頁面連結
- 製作 Tk 應用程式的基本步驟 ⇨ YouTube 頁面連結
- Tk 的三種版面管理員 ⇨ YouTube 頁面連結
- Tk 的各種視窗元件 ⇨ YouTube 頁面連結
- 用類別設計 Tk 應用程式的步驟 ⇨ YouTube 頁面連結