美文网首页tkinter
[译][Tkinter 教程07] Entry 控件

[译][Tkinter 教程07] Entry 控件

作者: _Lyux | 来源:发表于2017-11-30 13:19 被阅读6次

    原系列地址: Python Tkinter

    简介

    Entry 是 Tkinter 用来接收字符串等输入的控件. 该控件允许用户输入一行文字. 如果用户输入的文字长度长于 Entry 控件的宽度时, 文字会向后滚动. 这种情况下所输入的字符串无法全部显示. 点击箭头符号可以将不可见的文字部分移入可见区域. 如果你想要输入多行文本, 就需要使用 Text 控件. Entry 控件只能使用预设字体.
    使用 Entry 控件的语法如下:
    w = Entry(master, option, ...)
    master 参数为其父控件, 就是用来放置这个 Entry 的控件. 像其他控件一样, 我们可以在创建 Entry 控件之后再为其指定属性. 因此创建方法中的 options 选项可以为空.
    下例为一个显示了两个 Entry 控件的应用. 一个用来输入姓氏, 一个用来输入名字. 我们用不带参数的构造方法创建 Entry.

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

    上面代码运行后生成如下窗口:


    现在我们已经创建了两个 Entry, 用户可以在这个应用中输入数据. 但我们的程序如何得到这些数据呢?
    方法很简单, 调用 Entry 类的 get() 方法即可. 我们改进了上面的程序, 添加了 "退出" 和 "显示" 两个按钮. 在 "显示" 按钮上, 我们绑定了 show_entry_fields() 函数, 该函数会调用 Entry 类的 get() 方法. 这样每次 "显示" 按钮被点击, Entry 控件的内容就会打印在终端里.

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

    上面的代码运行后显示下面的窗口:


    现在我们希望在 Entry 控件上显示默认值. 比如, 我们希望姓氏输入框的默认值为 "Miller", 名字输入框的默认值为 "Jill". 我们只需要在 Entry 控件创建后加入如下两行代码:

    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 来显示.

    #!/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()
    

    我们的计算器显示如下:


    利率计算器

    下面的公式可以用来计算余额: 给定本金 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 中, 上面程序显示如下窗口:



    译者水平有限, 如有疏漏, 欢迎指正.
    已获得原作者授权. 原文地址: Entry Widgets

    相关文章

      网友评论

        本文标题:[译][Tkinter 教程07] Entry 控件

        本文链接:https://www.haomeiwen.com/subject/drdvbxtx.html