已獲原做者受權. 原系列地址: Python Tkinter
Entry 是 Tkinter 用來接收字符串等輸入的控件. 該控件容許用戶輸入一行文字. 若是用戶輸入的文字長度長於 Entry 控件的寬度時, 文字會向後滾動. 這種狀況下所輸入的字符串沒法所有顯示. 點擊箭頭符號能夠將不可見的文字部分移入可見區域. 若是你想要輸入多行文本, 就須要使用 Text 控件. Entry 控件只能使用預設字體.
使用 Entry 控件的語法以下:w = Entry(master, option, ...)
master
參數爲其父控件, 就是用來放置這個 Entry 的控件. 像其餘控件同樣, 咱們能夠在建立 Entry 控件以後再爲其指定屬性. 所以建立方法中的 options
選項能夠爲空.
下例爲一個顯示了兩個 Entry 控件的應用. 一個用來輸入姓氏, 一個用來輸入名字. 咱們用不帶參數的構造方法建立 Entry.php
from tkinter import * master = Tk() Label(master, text="First Name").grid(row=0) Label(master, text="Last Name").grid(row=1) e1 = Entry(master) e2 = Entry(master) e1.grid(row=0, column=1) e2.grid(row=1, column=1) mainloop( )
上面代碼運行後生成以下窗口:python
如今咱們已經建立了兩個 Entry, 用戶能夠在這個應用中輸入數據. 但咱們的程序如何獲得這些數據呢?
方法很簡單, 調用 Entry 類的 get()
方法便可. 咱們改進了上面的程序, 添加了 "退出" 和 "顯示" 兩個按鈕. 在 "顯示" 按鈕上, 咱們綁定了 show_entry_fields()
函數, 該函數會調用 Entry 類的 get()
方法. 這樣每次 "顯示" 按鈕被點擊, Entry 控件的內容就會打印在終端裏.segmentfault
from tkinter import * def show_entry_fields(): print("First Name: %s\nLast Name: %s" % (e1.get(), e2.get())) master = Tk() Label(master, text="First Name").grid(row=0) Label(master, text="Last Name").grid(row=1) e1 = Entry(master) e2 = Entry(master) e1.grid(row=0, column=1) e2.grid(row=1, column=1) Button(master, text='Quit', command=master.quit).grid(row=3, column=0, sticky=W, pady=4) Button(master, text='Show', command=show_entry_fields).grid(row=3, column=1, sticky=W, pady=4) mainloop( )
上面的代碼運行後顯示下面的窗口:app
如今咱們但願在 Entry 控件上顯示默認值. 好比, 咱們但願姓氏輸入框的默認值爲 "Miller", 名字輸入框的默認值爲 "Jill". 咱們只須要在 Entry 控件建立後加入以下兩行代碼:ide
e1.insert(10,"Miller") e2.insert(10,"Jill")
若是要在每次點擊 "顯示" 按鈕輸出內容後, 將 Entry 的顯示內容清空呢? 沒問題! 咱們能夠使用 Entry 類的 delete()
方法. 該方法的調用方式爲 delete(first, last = None)
, 兩個參數都是整型. 若是隻傳入一個參數, 則會刪除這個數字指定位置 (index) 上的字符. 若是傳入兩個參數, 則表示刪除從 "first" 到 "last" 指定範圍內的字符. 使用 delete(0, END)
能夠刪除 Entry 控件已輸入的所有字符.函數
from tkinter import * def show_entry_fields(): print("First Name: %s\nLast Name: %s" % (e1.get(), e2.get())) e1.delete(0,END) e2.delete(0,END) master = Tk() Label(master, text="First Name").grid(row=0) Label(master, text="Last Name").grid(row=1) e1 = Entry(master) e2 = Entry(master) e1.insert(10,"Miller") e2.insert(10,"Jill") e1.grid(row=0, column=1) e2.grid(row=1, column=1) Button(master, text='Quit', command=master.quit).grid(row=3, column=0, sticky=W, pady=4) Button(master, text='Show', command=show_entry_fields).grid(row=3, column=1, sticky=W, pady=4) mainloop( )
下個例子中, 咱們用更優雅的方式爲多個字段建立了多個 Entry 控件. 咱們用一個 list 來存儲每一個 Entry 的描述字符串, 這些字符串用 Label 來顯示.oop
#!/usr/bin/python3 from tkinter import * fields = 'Last Name', 'First Name', 'Job', 'Country' def fetch(entries): for entry in entries: field = entry[0] text = entry[1].get() print('%s: "%s"' % (field, text)) def makeform(root, fields): entries = [] for field in fields: row = Frame(root) lab = Label(row, width=15, text=field, anchor='w') ent = Entry(row) row.pack(side=TOP, fill=X, padx=5, pady=5) lab.pack(side=LEFT) ent.pack(side=RIGHT, expand=YES, fill=X) entries.append((field, ent)) return entries if __name__ == '__main__': root = Tk() ents = makeform(root, fields) root.bind('<Return>', (lambda event, e=ents: fetch(e))) b1 = Button(root, text='Show', command=(lambda e=ents: fetch(e))) b1.pack(side=LEFT, padx=5, pady=5) b2 = Button(root, text='Quit', command=root.quit) b2.pack(side=LEFT, padx=5, pady=5) root.mainloop()
上面的代碼運行後產生以下窗口:佈局
咱們並不是要寫一個功能全面的計算器, 咱們要用 Entry 接受一個數學表達式並計算它, 並打印計算結果.字體
from Tkinter import * from math import * def evaluate(event): res.configure(text = "Ergebnis: " + str(eval(entry.get()))) w = Tk() Label(w, text="Your Expression:").pack() entry = Entry(w) entry.bind("<Return>", evaluate) entry.pack() res = Label(w) res.pack() w.mainloop()
咱們的計算器顯示以下:fetch
下面的公式能夠用來計算餘額: 給定本金 B0, 期利率 r, 在 k 期結算後的餘額 Bk:
其中:
rate = 百分比表示的利率, 好比 3% i = rate / 100, 以小數表示的年利率 r = 期利率 = i / 12 B<sub>0</sub> = 初始餘額, 即本金 B<sub>k</sub> = k 期後的餘額 k = 期數 (月數) p = 每個月利息
若是要每個月結息, 咱們就要計算每個月應付利息. 咱們將公式中的 Bn 設爲 0, 獲得如下公式:
其中:
n = 總期數 (總月數)
#!/usr/bin/python3 from tkinter import * fields = ('Annual Rate', 'Number of Payments', 'Loan Principle', 'Monthly Payment', 'Remaining Loan') def monthly_payment(entries): # period rate: r = (float(entries['Annual Rate'].get()) / 100) / 12 print("r", r) # principal loan: loan = float(entries['Loan Principle'].get()) n = float(entries['Number of Payments'].get()) remaining_loan = float(entries['Remaining Loan'].get()) q = (1 + r)** n monthly = r * ( (q * loan - remaining_loan) / ( q - 1 )) monthly = ("%8.2f" % monthly).strip() entries['Monthly Payment'].delete(0,END) entries['Monthly Payment'].insert(0, monthly ) print("Monthly Payment: %f" % float(monthly)) def final_balance(entries): # period rate: r = (float(entries['Annual Rate'].get()) / 100) / 12 print("r", r) # principal loan: loan = float(entries['Loan Principle'].get()) n = float(entries['Number of Payments'].get()) q = (1 + r)** n monthly = float(entries['Monthly Payment'].get()) q = (1 + r)** n remaining = q * loan - ( (q - 1) / r) * monthly remaining = ("%8.2f" % remaining).strip() entries['Remaining Loan'].delete(0,END) entries['Remaining Loan'].insert(0, remaining ) print("Remaining Loan: %f" % float(remaining)) def makeform(root, fields): entries = {} for field in fields: row = Frame(root) lab = Label(row, width=22, text=field+": ", anchor='w') ent = Entry(row) ent.insert(0,"0") row.pack(side=TOP, fill=X, padx=5, pady=5) lab.pack(side=LEFT) ent.pack(side=RIGHT, expand=YES, fill=X) entries[field] = ent return entries if __name__ == '__main__': root = Tk() ents = makeform(root, fields) root.bind('', (lambda event, e=ents: fetch(e))) b1 = Button(root, text='Final Balance', command=(lambda e=ents: final_balance(e))) b1.pack(side=LEFT, padx=5, pady=5) b2 = Button(root, text='Monthly Payment', command=(lambda e=ents: monthly_payment(e))) b2.pack(side=LEFT, padx=5, pady=5) b3 = Button(root, text='Quit', command=root.quit) b3.pack(side=LEFT, padx=5, pady=5) root.mainloop()
在 Python3 中, 上面程序顯示以下窗口:
全系列:
[譯][Tkinter 教程01] 入門: Label 控件
[譯][Tkinter 教程02] Message 控件
[譯][Tkinter 教程03] Button 控件
[譯][Tkinter 教程04] Variable 類
[譯][Tinkter 教程05] Radiobutton 控件
[譯][Tkinter 教程06] Checkbox 控件
[譯][Tkinter 教程07] Entry 控件
[譯][Tkinter 教程08] Canvas 圖形繪製
[譯][Tkinter 教程09] Scale 控件
[譯][Tkinter 教程10] Text 控件
[譯][Tkinter 教程11] 對話框和消息框
[譯][Tkinter 教程12] 佈局管理 (Pack Place Grid)
[譯][Tkinter 教程13] Mastermind 遊戲
[譯][Tkinter 教程14] menu 菜單
[譯][Tkinter 教程15] event 事件綁定
譯者水平有限, 若有疏漏, 歡迎指正.
已得到原做者受權. 原文地址: Entry Widgets