Python的GUI程式設計(三)Entry(條目)
使用 Entry 控制元件的語法如下:
w = Entry(master, option, ...)
master 引數為其父控制元件, 就是用來放置這個 Entry 的控制元件. 像其他控制元件一樣, 我們可以在建立 Entry 控制元件之後再為其指定屬性. 因此建立方法中的 options
Tkinter Entry(文字框)的選項、方法說明,以及一些示例:
http://www.cnblogs.com/onlyfu/archive/2013/03/07/2947473.html#get
程式1:
from Tkinter import *
root=Tk()
En=Entry(root,text='Entry').pack()
root.mainloop()
未顯示文字內容,與Lable和Button不同,Entry的text屬性不可以設定Entry的文字在Entry中設定初始值,使用textvariable將變數與Entry繫結
class StringVar(Variable): """Value holder for strings variables."""_default = "" def __init__(self, master=None, value=None, name=None): """Construct a string variable. MASTER can be given as master widget. VALUE is an optional value (defaults to "") NAME is an optional Tcl name (defaults to PY_VARnum). If NAME matches an existing variable and VALUE is omittedthen the existing value is retained. """
””“構建一個字串變數。
MASTER可以作為主小部件。
值是可選的值(預設為“”空)
名稱是一個可選的Tcl名稱(預設為PY_VARnum)。
如果名稱與現有變數匹配,則省略該值。
然後保留現有的值。
”“”
Variable.__init__(self, master, value, name)設定
def set(self, value): """Set the variable to VALUE.""" return self._tk.globalsetvar(self._name, value)
from Tkinter import *
root=Tk()
#定義StringVar()類物件
e=StringVar()
En=Entry(root,textvariable=e).pack()
#物件值設定
e.set('Entry')
root.mainloop()
與Entry繫結,然後將e的值設定為'Entry',程式執行時的初始值便設定了(該值是可變的)。
修改引數狀態(只讀),使用者不可以對其進行修改,如下:
from Tkinter import *
root=Tk()
#定義StringVar()類物件
e=StringVar()
En=Entry(root,textvariable=e,state='readonly').pack()
#物件值設定
e.set('Entry')
#也可以像字典一樣修改鍵對應的值
#En['state']='readonly'
root.mainloop()
由於Entry等控制元件中的引數是關鍵字引數,其由鍵-值組成。
關鍵字引數是在傳遞構成中不必按照順序傳遞,必須要提供”傳遞引數名=傳遞引數值”形式的引數,而傳遞過程中也轉變為dict的鍵值對map關係。
所以可以通過config方法來修改引數值,也可以通過字典的形式修改。
登入介面:
from Tkinter import *
root=Tk()
label=Label(root,text='使用者名稱:',anchor='c').grid(row=0)
En=Entry(root).grid(row=0,column=1)
label1=Label(root,text='密碼 :',anchor='c').grid(row=1)
En1=Entry(root,show='*').grid(row=1,column=1)
Button(root,text='確定',anchor='c',width=6,height=1).grid(row=2,column=1)
root.mainloop()
登入介面是否成功?
from Tkinter import *
root=Tk()
def Show():
root1 = Tk()
if En.get()=='zhangsan' and En1.get()=='123456':
Label(root1, text='登陸成功!', fg='blue', width=30, height=8, anchor='c').pack()
else:
Label(root1,text='使用者名稱或密碼錯誤!',fg='blue',width=30,height=8,anchor='c').pack()
label=Label(root,text='使用者名稱:',anchor='c').grid(row=0)
En=Entry(root)
En.grid(row=0,column=1)
label1=Label(root,text='密碼 :',anchor='c').grid(row=1)
En1=Entry(root,show='*')
En1.grid(row=1,column=1)
Button(root,text='退出',anchor='c',width=6,height=1,command=root.quit).grid(row=2,column=0)
Button(root,text='確定',anchor='c',width=6,height=1,command=Show).grid(row=2,column=1)
root.mainloop()
輸入:使用者名稱:zhangsan,密碼:123456
輸入其它:
以上程式碼功能不齊全,接下來介面設定重置功能,輸入錯誤後Entry介面返回即銷燬Entry介面。
Entry 類的 delete() 方法. 該方法的呼叫方式為 delete(first, last = None), 兩個引數都是整型. 如果只傳入一個引數, 則會刪除這個數字指定位置 (index) 上的字元. 如果傳入兩個引數, 則表示刪除從 “first” 到 “last” 指定範圍內的字元. 使用 delete(0, END) 可以刪除 Entry 控制元件已輸入的全部字元.
from Tkinter import *
root=Tk()
root.title('登入介面')
def NewGui():
root2=Tk()
root2.title('Web')
Label(root2,width=20,height=20)
#判斷登入介面是否成功
def Show():
root1 = Tk()
root1.title('Entry')
if En.get()=='zhangsan' and En1.get()=='123456':
Label(root1, text='登陸成功!', fg='blue', width=30, height=8, anchor='c').pack()
#模擬下網頁跳轉
Button(root1, text='下一步', width=6, height=1, anchor='c', command=NewGui, fg='red').pack()
else:
Label(root1,text='使用者名稱或密碼錯誤!',fg='blue',width=30,height=8,anchor='c').pack()
#銷燬root1視窗
Button(root1,text='返回',width=6,height=1,anchor='c',command=root1.destroy,fg='red').pack()
#重置
def ReSet():
En.delete(0,END)
En1.delete(0, END)
label=Label(root,text='使用者名稱:',anchor='c').grid(row=0)
En=Entry(root)
En.grid(row=0,column=1)
label1=Label(root,text='密碼 :',anchor='c').grid(row=1)
En1=Entry(root,show='*')
En1.grid(row=1,column=1)
Button(root,text='重置',anchor='c',width=6,height=1,command=ReSet).grid(row=2,column=1)
Button(root,text='退出',anchor='c',width=6,height=1,command=root.quit).grid(row=2,column=0)
Button(root,text='確定',anchor='c',width=6,height=1,command=Show).grid(row=2,column=2)
root.mainloop()
輸入錯誤情況下bind方法:bind("<Button-1>", callback) 給元件繫結事件響應函式
事件描述字串 <modifier-type-detail>
type - 是事件描述中最重要的部分,比如Button, Key, Enter, Configure等
如果僅僅為了匹配一個特定的按鍵,可以省略兩邊的尖括號,直接輸入按鍵
常用事件:
<Button-1> 滑鼠點選事件,1-左鍵 2-中鍵 3-右鍵
<B1-Motion> 滑鼠按下後移動,1-左鍵 2-中鍵 3-右鍵
<ButtonRelease-1> 滑鼠擡起,1-左鍵 2-中鍵 3-右鍵
<Double-Button-1> 滑鼠雙擊,1-左鍵 2-中鍵 3-右鍵
<Enter> 滑鼠進入元件範圍
<Leave> 滑鼠離開元件範圍
<FocusIn> 焦點聚焦到元件範圍
<FocusOut> 焦點離開元件範圍
<Return> 按回車鍵
<Shift_L> 左shift鍵
Cancel (the Break key)
BackSpace
Tab
Control_L
Alt_L
Pause, Caps_Lock, Escape, Prior (Page Up), Next (Page Down), End, Home, Left, Up, Right, Down, Print, Insert, Delete, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, Num_Lock, and Scroll_Lock
<Key> 按下任意鍵盤鍵,event.char 返回按下的鍵。特殊按鍵返回空字串
<space> 按下空格
<less> 左括號
<Shift-Up> 按住shift同時按上鍵,附加按鍵有Alt, Shift, and Control
<Configure> 改變元件大小 event.width event.height 返回新的大小
bind的繫結層級
bind 繫結元件例項
bind 繫結頂級元件root
bind_class 繫結元件類
bind_all 繫結所有元件
繫結事件,後繫結覆蓋先繫結
text.bind("<Return>", lambda e: "break") 遮蔽某text的回車事件
top.bind_class("Text", "<Return>", lambda e: None) 遮蔽所有Text的回車事件
參考:http://blog.csdn.net/sofeien/article/details/50982208
多個欄位建立了多個 Entry 控制元件. 用一個 list 來儲存每個 Entry 的描述字串, 這些字串用 Label 來顯示.
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()
root.title('Message')
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()
利率計算器
下面的公式可以用來計算餘額: 給定本金 B0, 期利率 r, 在 k 期結算後的餘額 Bk:
其中:
rate = 百分比表示的利率, 比如 3%
i = rate / 100, 以小數表示的年利率
r = 期利率 = i / 12
B0 = 初始餘額, 即本金
Bk = k 期後的餘額
k = 期數 (月數)
p = 每月利息
如果要每月結息, 我們就要計算每月應付利息. 我們將公式中的 Bn 設為 0, 得到以下公式:
from Tkinter import *
fields = ('Annual Rate', 'Number of Payments', 'Loan Principle', 'Monthly Payment', 'Remaining Loan')
def fetch(entries):
pass
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('Return', (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()
參考:http://blog.csdn.net/liuxu0703/article/details/60781107