资讯专栏INFORMATION COLUMN

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

levy9527 / 3435人阅读

摘要:已获原作者授权原系列地址简介是用来接收字符串等输入的控件该控件允许用户输入一行文字如果用户输入的文字长度长于控件的宽度时文字会向后滚动这种情况下所输入的字符串无法全部显示点击箭头符号可以将不可见的文字部分移入可见区域如果你想要输入多行文本就

已获原作者授权. 原系列地址: 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
Last 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
Last 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("", (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("", evaluate)
entry.pack()
res = Label(w)
res.pack()
w.mainloop()

我们的计算器显示如下:

利率计算器

下面的公式可以用来计算余额: 给定本金 B0, 期利率 r, 在 k 期结算后的余额 Bk:

其中:

rate = 百分比表示的利率, 比如 3%
i = rate / 100, 以小数表示的年利率
r = 期利率 = i / 12
B0 = 初始余额, 即本金
Bk = 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 中, 上面程序显示如下窗口:


全系列:
[译][Tkinter 教程01] 入门: Label 控件
[译][Tkinter 教程02] Message 控件
[译][Tkinter 教程03] Button 控件
[译][Tkinter 教程04] Variable 类
[译][Tinkter 教程05] Radiobutton 控件
[译][Tkinter 教程06] Checkbox 控件
[译][Tkinter 教程07] Entry 控件
[译][Tkinter 教程08] Canvas 图形绘制
[译][Tkinter 教程09] Scale 控件
[译][Tkinter 教程10] Text 控件
[译][Tkinter 教程11] 对话框和消息框
[译][Tkinter 教程12] 布局管理 (Pack Place Grid)
[译][Tkinter 教程13] Mastermind 游戏
[译][Tkinter 教程14] menu 菜单
[译][Tkinter 教程15] event 事件绑定
译者水平有限, 如有疏漏, 欢迎指正.
已获得原作者授权. 原文地址: Entry Widgets

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41482.html

相关文章

  • [][Tkinter 教程04] Variable 类

    摘要:已获原作者授权原系列地址类有些控件比如控件控件等可以通过传入特定参数直接和一个程序变量绑定这些参数包括这种绑定是双向的如果该变量发生改变与该变量绑定的控件也会随之更新这些控制变量和一般的变量一样都是用来保存某个值的但一般的变量不能被传递给或 已获原作者授权. 原系列地址: Python Tkinter Variable 类 有些控件 (比如 Entry 控件, Radiobutton...

    zilu 评论0 收藏0
  • [][Tkinter 教程09] Scale 控件

    摘要:已获原作者授权原系列地址简介中的控件是一种可供用户通过拖动指示器改变变量值的控件这种控件可以水平放置也可以竖直放置可以在用户界面中放置一个控件用户通过拖动该控件就可以在某个取值范围内选择一个合适的值控件可以设置最大最小值以确定取值范围我们也 已获原作者授权. 原系列地址: Python Tkinter 简介 Tkinter 中的 Scale 控件是一种可供用户通过拖动指示器改变变量值...

    ralap 评论0 收藏0
  • [][Tkinter 教程03] Button 控件

    摘要:已获原作者授权原系列地址简介控件是一种标准控件用来展现不同样式的按钮控件被用以和用户交互比如按钮被鼠标点击后某种操作被启动和控件类似按钮可以展示图片或者文字不同的是控件可以指定字体控件只能使用单一的字体上的文字可以多行显示可以将一个函数或方 已获原作者授权. 原系列地址: Python Tkinter 简介 Button 控件是一种标准 Tkinter 控件, 用来展现不同样式的按钮...

    googollee 评论0 收藏0
  • [][Tkinter 教程14] menu 菜单

    摘要:已获原作者授权原系列地址简介一提到这个词很多人首先想到的是餐馆里的菜单虽然餐馆菜单和计算机程序中的菜单看起来一点也不像但他们确实有很多共同点在餐馆中菜单列举了所有菜品和饮料在计算机程序中菜单通过图形界面展示了应用程序可用的命令和功能在用户界 已获原作者授权. 原系列地址: Python Tkinter 简介 一提到menu这个词, 很多人首先想到的是餐馆里的菜单. 虽然餐馆菜单和计算...

    joyqi 评论0 收藏0
  • [][Tkinter 教程02] Message 控件

    摘要:已获原作者授权原系列地址控件控件用来展示一些文字短消息和控件有些类似但在展示文字方面比要灵活比如控件可以改变字体而控件只能使用一种字体它提供了一个换行对象以使文字可以断为多行它可以支持文字的自动换行及对齐这里要澄清一下前面提到的控件可以改变 已获原作者授权. 原系列地址: Python Tkinter Message 控件 Message 控件用来展示一些文字短消息. Message...

    JowayYoung 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<