Entry控件是Tkinter GUI編程中的基礎控件之一,它的作用就是允許用戶輸入内容,從而實現GUI程序與用戶的交互,比如儅用戶登錄軟件時,輸入用戶名和密碼,此時就需要使用Entry控件。
Entry控件的基本語法格式如下:
tk_entry = Entry(master, option, ...)
基本屬性
exportselection | 默認情況下,如果在輸入框中選中文本會複製到粘貼板,如果要忽略這個功能,可以設置為exportselection=0 |
selecbackground | 選中文字時的背景顔色 |
selecforeground | 選中文字時的前景色 |
show | 指定文本框内容以何種樣式的字符顯示,比如密碼可以將值設置爲show = ”*“ |
textvariable | 輸入框内值,也稱動態字符串,使用StringVar()對象來設置,而text為靜態字符串對象 |
xscrollcommand | 設置輸入框内容滾動條 |
1)動態數據類型
上述表格中提及了StringVar()方法,和其同類型的方法還有BooleanVar()、DoubleVar()、IntVar(),他們分別代表一種數據類型,即字符串、布爾值、浮點型、整型,這些方法並不屬於Python内置方法,而是Tkinter特有的方法。
在界面編程的過程中,儅需要”動態跟蹤“一些變量值的變化,從而保證值得變換能及時的反應到顯示界面上,而Python内置的數據類型無法滿足這一目的時,需要使用Tcl内置的對象,把這些方法創建的數據類型稱爲”動態類型“。
下面是”動態字符串“的演示示例:
import tkinter as tk
import time
#創建主窗口
root = tk.Tk()
#設置主窗口名
root.title("演示示例")
#設置logo
root.iconbitmap("C:/Users/Administrator/Desktop/1.ico")
#設置主窗口大小
root.geometry("450x150+100+100")
#禁止調整主窗口大小
root.resizable(0, 0)
#修改主窗口名
root.title("我們的時鐘")
#獲取時間的函數
def gettime():
#獲取當前時間
dstr.set(time.strftime("%H:%M:%S"))
#每隔1s調用一次gettime()函數來獲取時間
root.after(1000, gettime)
#生成動態字符串
dstr = tk.StringVar()
#利用textvariable來實現文本變化
lb = tk.Label(root, textvariable = dstr, fg = 'green', font = ("微軟雅黑", 85))
lb.pack()
#調用生成時間的函數
gettime()
#顯示主窗口
root.mainloop()
代碼運行結果如下:
屏幕录制 2025-03-10 180510
常用方法
方法 | 説明 |
delete() | 根據索引值刪除輸入框内的值 |
get() | 獲取輸入框内的值 |
set() | 設置輸入框内的值 |
insert() | 在指定的位置插入字符串 |
index() | 返回指定的索引值 |
select_clear() | 取消選中狀態 |
select_adjust() | 確保輸入框中的範圍包含index參數所指定的字符,選中指定索引和光標所在位置之前的字符 |
select_from(index) | 設置一個新的選中範圍,通過索引值index來設置 |
select_present() | 返回輸入框是否有處於選中狀態的文本,如果有則返回true,否則返回false |
select_to() | 選中指定索引與光標之間的所有值 |
select_range() | 選中指定索引與光標之間的所有值,參數值為start,end,要求start必須小於end |
注意:在Entry控件中,可以通過以下方式來指定字符的所在位置:
*數字索引:表示從0開始的索引數字;
*”ANCHOE“:在存在字符的情況下,它對應第一個被選中的字符
*”END“:對應已存在文本中的最後一個位置
*”insert(index,"字符")“:將字符插入到index指定的索引位置
具體示例如下:
import tkinter as tk
#設置主窗口
window = tk.Tk()
#設置主窗口大小
window.geometry("250x100")
#設置主窗口名
window.title("演示示例")
#設置主窗口logo
#window.iconbitmap("C:/Users/Administrator/Desktop/1.ico")
#禁止調整主窗口大小
window.resizable(0,0)
#創建輸入框控件
entry1 = tk.Entry(window)
#放置輸入框,并設置位置
entry1.pack(padx = 20, pady = 20)
#根據索引值,刪除輸入框内的值
entry1.delete(0, "end")
#插入默認文本
entry1.insert(0,"演示示例")
#得到輸入框字符串
print(entry1.get())
#刪除所有字符
#entry1.delete(0, tk.END)
#顯示主窗口
window.mainloop()
代碼運行結果如下:
Entry控件簡單示例1:
import tkinter as tk
#設置主窗口
window = tk.Tk()
#設置主窗口大小
window.geometry("250x100")
#設置主窗口名
window.title("演示示例")
#設置主窗口logo
#window.iconbitmap("1.ico")
#禁止修改主窗口界面大小
window.resizable(0,0)
#新建文本標簽
label1 = tk.Label(window, text = "賬號:")
label2 = tk.Label(window, text = "密碼:")
#grid()控件佈局管理器,以行、列的形式對控件進行佈局,後續會做詳細介紹
label1.grid(row = 0)
label2.grid(row = 1)
#為上面的文本標簽,創建兩個輸入框控件
entry1 = tk.Entry(window)
entry2 = tk.Entry(window)
#對控件進行佈局管理,放在文本標簽的後面
entry1.grid(row = 0, column = 1)
entry2.grid(row = 1, column = 1)
#顯示主窗口
window.mainloop()
代碼運行結果如下所示:
Entry控件驗證功能
參數 | 説明 |
validate | 指定驗證方式,字符串參數,參數值有focus、focusin、focusout、key、all、none |
validatecommand | 指定用戶自定義的驗證函數,該函數只能返回True或False |
invalidcommand | 儅validatecommand指定的驗證函數返回False時,可以使用該參數再指定一個驗證函數 |
對validate的參數值進行檢點介紹:
參數值 | 説明 |
focus | 儅Entry組件獲得或失去焦點的時候驗證 |
focusin | 儅Entry組件獲得焦點的時候驗證 |
focuson | 儅Entry組件失去焦點的時候驗證 |
key | 儅輸入框被編輯的時候驗證 |
all | 儅出現上面任何一種情況的時候驗證 |
none | 默認不啓用驗證功能,需要注意的是這裏是字符串的"none |
具體代碼如下:
import tkinter as tk
from tkinter import messagebox
# 創建主窗口
window = tk.Tk()
# 設置窗口大小和位置
window.geometry("250x200+250+200")
# 設置窗口標題
window.title("演示示例")
# 設置窗口圖標(備注:這段代碼在原文件中是備注掉的,這裡不需要)
# window.iconbitmap("1.ico")
# 禁止調整窗口大小
window.resizable(0, 0)
# 定義驗證函數,用於檢查輸入框中的內容
def check():
if entry1.get() == "演示示例":
# 如果輸入框中的內容是 "演示示例",顯示信息框並返回 True
messagebox.showinfo("輸入正確")
return True
else:
# 如果輸入框中的內容不是 "演示示例",顯示警告框,清空輸入框並返回 False
messagebox.showwarning("輸入不正確")
entry1.delete(0, tk.END)
return False
# 創建標籤,顯示 "賬號:"
label1 = tk.Label(window, text="賬號:")
# 創建標籤,顯示 "密碼:"
label2 = tk.Label(window, text="密碼:")
# 使用 grid 布局管理器放置標籤
label1.grid(row=0)
label2.grid(row=1)
# 創建一個 StringVar 對象,用於綁定到輸入框
dy_string = tk.StringVar()
# 創建輸入框,綁定到 dy_string,並設置驗證命令
entry1 = tk.Entry(window, textvariable=dy_string, validate="focusout", validatecommand=check)
# 創建另一個輸入框
entry2 = tk.Entry(window)
# 使用 grid 布局管理器放置輸入框
entry1.grid(row=0, column=1)
entry2.grid(row=1, column=1)
# 進入主事件循環
window.mainloop()
代碼運行結果如下:
Tkinter為驗證函數還提供了一些額外的選項,這些額外的選項需要使用Register()方法:
選項 | 説明 |
%d | 有3個參數值:0表示刪除操作、1表示插入操作、2表示獲得或失去焦點等 |
%i | 儅用戶進行插入或者刪除操作時,該選項表示插入或者刪除的索引位置 |
%P | 指定輸入框的文本内容 |
%s | 調用驗證函數前輸入框内的文本内容 |
%S | 表示被刪除或插入的内容 |
%v | 當前Entry控件的validate的值 |
%V | 表示觸發驗證函數的原因 |
%W | 表示控件類型,即控件名字 |
代碼示例如下:
import tkinter as tk
from tkinter import messagebox
# 創建主窗口
window = tk.Tk()
# 設置窗口大小和位置
window.geometry("250x200+250+200")
# 設置窗口標題
window.title("演示示例")
# 設置窗口圖標(備注:這段代碼在原文件中是備注掉的,這裡不需要)
# window.iconbitmap("1.ico")
# 禁止調整窗口大小
window.resizable(0, 0)
# 創建標籤,顯示 "賬號:"
label1 = tk.Label(window, text="賬號:")
# 創建標籤,顯示 "密碼:"
label2 = tk.Label(window, text="密碼:")
# 使用 grid 布局管理器放置標籤
label1.grid(row=0)
label2.grid(row=1)
# 創建一個 StringVar 對象,用於綁定到輸入框
dy_string = tk.StringVar()
# 定義驗證函數,用於檢查輸入框中的內容
def check(strings, reason, id):
if entry1.get() == "演示示例":
# 如果輸入框中的內容是 "演示示例",顯示信息框並返回 True
messagebox.showinfo("輸入正確")
print(strings, reason, id)
return True
else:
# 如果輸入框中的內容不是 "演示示例",顯示警告框,清空輸入框並返回 False
messagebox.showwarning("輸入不正確")
print(strings, reason, id)
return False
CheckTest = window.register(check)
# 創建輸入框,綁定到 dy_string,並設置驗證命令
entry1 = tk.Entry(window, textvariable=dy_string, validate="focusout", validatecommand=(CheckTest, '%P', '%V', '%W'))
# 創建另一個輸入框
entry2 = tk.Entry(window)
# 使用 grid 布局管理器放置輸入框
entry1.grid(row=0, column=1)
entry2.grid(row=1, column=1)
# 進入主事件循環
window.mainloop()
代碼運行結果如下:
實例演示——計算機小程序
from tkinter import *
# 創建主窗口
window = Tk()
# 設置窗口大小和位置
window.geometry("250x200+250+200")
# 設置窗口標題
window.title("演示示例")
# 設置窗口圖標(備注:這段代碼在原文件中是備注掉的,這裡不需要)
# window.iconbitmap("1.ico")
# 創建一個框架,用於組織窗口中的部件
frame = Frame(window)
# 創建一個標籤,用於顯示計算結果
label1 = Label(frame)
# 創建一個輸入框,用於輸入計算表達式
entry = Entry(frame)
# 創建一個 StringVar 對象,用於綁定到輸入框
expression = StringVar()
# 將 StringVar 對象綁定到輸入框
entry["textvariable"] = expression
# 定義計算函數,用於評估輸入框中的表達式並顯示結果
def calc():
try:
# 評估輸入框中的表達式並將結果轉換為字符串
result = "=" + str(eval(expression.get()))
# 更新標籤的文本為計算結果
label1.config(text=result)
except Exception as e:
# 如果發生錯誤,顯示錯誤信息
label1.config(text="錯誤")
print(f"計算錯誤: {e}")
# 創建一個按鈕,點擊時調用 calc 函數
button1 = Button(frame, text="等於", command=calc)
# 設置輸入框獲得焦點
entry.focus()
# 使用 pack 布局管理器放置框架
frame.pack()
# 使用 pack 布局管理器放置輸入框
entry.pack()
# 使用 pack 布局管理器放置標籤,並設置其位置在左側
label1.pack(side="left")
# 使用 pack 布局管理器放置按鈕,並設置其位置在右側
button1.pack(side="right")
# 進入主事件循環
window.mainloop()
代碼運行結果如下所示:
Spinbox高級輸入框
spinbox是Entry控件的升級版,是Tkinter版本后新增的控件,該控件不僅允許用戶直接輸入内容,還支持用戶使用微調選擇器,即上下按鈕來輸入内容。
代碼示例如下:
import tkinter as tk
# 創建主窗口
window = Tk()
# 設置窗口大小和位置
window.geometry("250x200+250+200")
# 設置窗口標題
window.title("演示示例")
# 設置窗口圖標(備注:這段代碼在原文件中是備注掉的,這裡不需要)
# window.iconbitmap("1.ico")
wind = tk.Spinbox(window, from_ = 0, to = 20, increment = 2, width = 15, bg = "#9BCD9B")
wind.pack()
window.mainloop()
代碼運行結果如下所示:
儅采用字符串形式時,需要使用values參數以元組的形式進行傳參,具體如下:
import tkinter as tk
# 創建主窗口
window = tk.Tk()
# 設置窗口大小和位置
window.geometry("250x200+250+200")
# 設置窗口標題
window.title("演示示例")
# 設置窗口圖標(備注:這段代碼在原文件中是備注掉的,這裡不需要)
# window.iconbitmap("1.ico")
wind = tk.Spinbox(window, values = ('Python', 'java', 'C語言', 'PHP'))
wind.pack()
window.mainloop()
代碼運行結果如下所示: