Tkinter (05) 輸入部件 Entry

Jason990420發表於2020-07-20

輸入部件的建立及其選項

import tkinter as tk
parent = tk.Tk()
w = tk.Entry(parent, option=value, ...)
選項 說明
bg or background 背景顏色
bd or borderwidth 外框寛度
cursor 在部件上方時, 滑鼠的圖樣
disabledbackground disabled 時, 背景顏色
disabledforeground disabled 時, 前景顏色
exportselection 文字可否複製到剪貼簿 0/1
fg or foreground 前景顏色
font 文字字型
highlightbackground 非聚焦時的聚焦顏色
highlightcolor 聚焦時的聚焦顏色
highlightthickness 聚焦厚度,內定 1, 0 則無
insertbackground 插入游標的背景顏色, 內定為黑色
insertborderwidth 插入游標外框寛度
insertofftime 插入游標消失的時間, 內定為 300ms
insertontime 插入游標顯現的時間, 內定為 600ms
invalidcommand 驗證輸入錯誤回撥函式的註冊值
insertwidth 插入游標寛度, 內定為 2 圖素, 至少為 insertborderwidth 的兩倍
justify 文字在輸入部件中相對的位置, 內定為 LEFT, RiGHT/CENTER.
readonlybackground readonly 時的背景色
relief 外框花樣, 內定為 SUNKEN
selectbackground 被選擇文字的背景顏色
selectborderwidth 被選擇文字的外框寛度, 內定為 1 圖素
selectforeground 被選擇文字的前景顏色
show 代替顯示的文字, 如密碼輸入為 ‘*’
state NORMAL, DISABLED, disabled (仍可以複製內容到剪貼簿)
takefocus TAB 鍵在部件是否會迴圈焦點 0/1
textvariable 輸入部件中的文字內容, 必須使用 StringVar()
validate 指定何時使用回撥函式驗證
validatecommand 驗證輸入回撥函式的註冊值
width 部件字寛, 內定為 20 個標準字寛
xscrollcommand 水平滾動條 scrollbar.set () 方法

方法及說明

方法 說明
delete(first, last=None) 刪除first ~ last(不含)的文字, last None 則只有在 first的一個字
get() 返回輸入件中的文字
icursor(index) 設游標的index之前的位置
index(index) 如果文字過長, 無法完全顯示, 用來設定最左的可顯示位置
insert(index, s) index前插入字串s
scan_dragto(x) 滑鼠鍵按下事件處理程式中已標記位置時,滑鼠滾動事件處理程式拖弋捲動部件,x為位置
scan_mark(x) 滑鼠鍵按下事件處理程式中標記位置x
select_adjust(index) 調整文字選擇區以包含索引index
select_clear() 去除選擇
select_from(index) 設定選擇區的起始索引處index
select_present() 目前是否有選擇區
select_range(start, end) 選擇first ~ last(不含)的文字
select_to(index) 選擇ANCHOR ~ index(不含)的文字
xview(index) 供水平滾動條scrollbar選項command使用
xview_moveto(f) 移動水平滾動條, f為 0 ~ 1
xview_scroll(number, what) 水平滾動畫布number個單位,單位whatUNITSPAGES, UNITS為字寛, PAGES的大小為頁, 正值向右, 負值向左

輸入驗證

回撥函式檢查輸入的文字若合乎要求, 返回 True, 否則返回 False.
在使用回撥函式之前, 必須先呼叫 register(回撥函式), 會返回一個字串 f, 用來呼叫函式.
使用 validatecommand/invalidcommand 指定回撥函式, validate 指定何時使用回撥函式.

validate

  1. ‘focus’ - 在失去或得到聚焦時驗證
  2. ‘focusin’ - 在得到聚焦時驗證
  3. ‘focusout’ - 在失去聚焦時驗證
  4. ‘key’ - 在任何輸入改變內容時驗證
  5. ‘all’ - 在所有情況下驗證
  6. ‘none’ - 不作驗證

validatecommand (invalidcommand)

  1. 如果回撥函式 (註冊值 f) 不需要任何引數, 使用 validatecommand = f
  2. 如果回撥函式 (註冊值 f) 需要一些引數, 使用 validatecommand = (f, s1, s2, …)
    s1, s2, … 使用代替碼, 如
    • ‘%d’ 0 刪除, 1 插入, -1 失去或得到聚焦, 或 textvariable 內容變動
    • ‘%i’ 刪除或插入的起始索引, -1 失去或得到聚焦, 或 textvariable 內容變動
    • ‘%P’ 如果更動是允許的, 文字的內容將會是這個引數.
    • ‘%s’ 文字變更前的內容
    • ‘%S’ 刪除或插入的文字
    • ‘%v’ validate 選項的值
    • ‘%V’ 回撥函式被呼叫的原因, ‘focusin’, ‘focusout’, ‘key’, ‘forced’ textvariable 內容變動
    • ‘%W’ 部件名

範例視窗及程式碼

Tkinter (05) 輸入部件 Entry

from tkinter import *

def xscroll_handler(*event):
    action, n = event[0:2]
    if action == 'scroll':
        units = event[2]
        entry.xview_scroll(n, units)
    elif action == 'moveto':
        entry.xview_moveto(n)

def validatecommand(code, index, substring):
    if code == '0':
        label.configure(text=f'Delete "{substring}" at index {index}')
    elif code == '1':
        label.configure(text=f'Insert "{substring}" at index {index}')
    else:
        label.configure(text='Focus in, out or textvariable revised.')
    return 1 if substring.isdigit() else 0

root = Tk()
font = ('Courier New', 16)
check = root.register(validatecommand)
entry = Entry(root, font=font, width=40, bg='darkgreen', fg='white',
    validate='all', validatecommand=(check, '%d', '%i', '%S'))
entry.grid(row=0, sticky=E+W)
x_scrollbar = Scrollbar(root, orient=HORIZONTAL, command=xscroll_handler)
x_scrollbar.grid(row=1, sticky=E+W)
entry['xscrollcommand'] = x_scrollbar.set
label = Label('', width=40, font=font, bg='darkgreen', fg='white')
label.grid(row=2, column=0)

root.mainloop()
本作品採用《CC 協議》,轉載必須註明作者和本文連結

Jason Yang

相關文章