Entry 是 Tkinter 用来接收字符串等输入的控件. 该控件允许用户输入一行文字. 如果用户输入的文字长度长于 Entry 控件的宽度时, 文字会向后滚动. 这种情况下所输入的字符串无法全部显示. 点击箭头符号可以将不可见的文字部分移入可见区域. 如果你想要输入多行文本, 就需要使用 Text 控件. Entry 控件只能使用预设字体.
使用 Entry 控件的语法如下:
w = Entry(master, option, ...)
master 参数为其父控件, 就是用来放置这个 Entry 的控件. 像其他控件一样, 我们可以在创建 Entry 控件之后再为其指定属性. 因此创建方法中的 options
Tkinter Entry(文本框)的选项、方法说明,以及一些示例:
程序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 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界面。
delete() 方法. 该方法的调用方式为 delete(first, last = None), 两个参数都是整型. 如果只传入一个参数, 则会删除这个数字指定位置 (index) 上的字符. 如果传入两个参数, 则表示删除从 “first” 到 “last” 指定范围内的字符. 使用 delete(0, END)
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的回车事件
参考:
多个字段创建了多个 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()