1. 程式人生 > >Python的GUI程式設計(三)Entry(條目)

Python的GUI程式設計(三)Entry(條目)

Entry 是 Tkinter 用來接收字串等輸入的控制元件. 該控制元件允許使用者輸入一行文字. 如果使用者輸入的文字長度長於 Entry 控制元件的寬度時, 文字會向後滾動. 這種情況下所輸入的字串無法全部顯示. 點選箭頭符號可以將不可見的文字部分移入可見區域. 如果你想要輸入多行文字, 就需要使用 Text 控制元件. 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()
未顯示文字內容,LableButton不同,Entrytext屬性不可以設定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 omitted
then 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