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()

未显示文本内容,与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界面。

         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

  • 24
    点赞
  • 164
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HySmiley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值