单行文本框控件
在Tkinter中,典型的单行文本框控件被称为Entry
。在这个案例中,我们将在我们的GUI中添加这样一个Entry
控件。我们将通过描述Entry
控件为用户执行的功能,使我们的标签更加有用。
准备就行
本案例基于上一篇《创建按钮并修改Text属性》中的代码,你可以从这里下载其中的代码。
如何操作
创建Entry_Widget.py
代码文件,并修改如下:
# Entry_Widget.py
# imports
import tkinter as tk
from tkinter import ttk
# Create instance
win = tk.Tk()
# Add title
win.title("Python GUI")
# Modified Button Click Function
def click_me():
action.configure(text="Hello " + name.get())
# Changing our Label
ttk.Label(win, text="Enter your name:").grid(column=0, row=0)
# Adding a Entry widget
name = tk.StringVar()
name_entry = ttk.Entry(win, width=12, textvariable=name)
name_entry.grid(column=0, row=1)
# Adding a Button
action = ttk.Button(win, text="Click Me!", command=click_me)
action.grid(column=1, row=1)
# Start GUI
win.mainloop()
执行以上代码,GUI界面如下所示:
在文本框中输入一些字符,并点击按钮,界面将变成下面的状态:
代码原理
在第16行,我们获取了Entry
控件的值。我们还没有使用面向对象编程(OOP),那么我们如何能够访问一个甚至还没有声明的变量(name
)的值呢?
在Python的过程式编程中,我们必须在使用一个名称的语句之前物理地定义该名称。那么这是怎么工作的呢(实际上它确实没毛病)?
答案是,按钮点击事件是一个回调函数,而当用户点击按钮时才会执行,此函数中引用的变量在按钮点击时已经是已知且确实存在的。
一切都很顺利。
第20行给我们的标签赋予了一个更有意义的内容,它描述了其下方的文本框需要输入的内容。
我们将按钮移动到标签旁边,以便在视觉上将两者关联起来。我们仍然在使用网格布局管理器,这将在第2章“布局管理”中更详细地解释。
第23行创建了一个变量name
。这个变量绑定到Entry
控件,并且,在我们的click_me()
函数中,我们可以通过调用此变量的get()
方法来获得Entry
控件的值,这非常有效。
通过尝试我们可以发现,即使我们输入了一个长文本,但文本框Entry控件并不会变长,这是因为我们在第24行将其宽度硬编码为12。
课后学习
Python 是一种动态类型语言,会根据赋值来推断类型。这意味着,如果我们将一个字符串赋值给变量 name
,那么它的类型就是字符串;如果我们将一个整数赋值给 name
,那么它的类型就是整数。
在使用 tkinter 时,我们必须先将 name
变量声明为 tk.StringVar()
类型,然后才能成功使用它。原因是 tkinter 并不是 Python 本身,作为Python的GUI库,它有自己的一套编码标准。我们可以从 Python 中使用 tkinter,但它并不是同一种语言。
本文的代码可以通过这里下载。