5、文本框Entry
5-1 文本框Entry的基本概念
所谓的文本框Entry,通常是指单行的文本框,在GUI程序设计中这是用于输入的最基本的Widget控件,我们可以使用它输入单行字符串,如果所输入的字符串长度大于文本框的宽度,所输入的文字会自动隐藏造成部分内容无法显示。碰到这种情况时,可以使用箭头键移动鼠标光标到看不到的区域。需留意的是文本框Entry限定是单行文字,如果想要处理多行文字需使用Widget控件中的Text,后面会详解。Entry的使用格式如下。
python
Entry(父对象, option, ...)
参数一:同上
下面是Entry()方法内其它常用的option参数
(1) bg或background:背景色彩。
(2) borderwidth或bd:边界宽度默认是2像素。
(3) command:当用户更改内容时,会自动执行此函数。
(4) cursor:当鼠标光标在复选框上时的光标形状、
(5) exportselection:如果执行选取时,所选取的字符串会自动输出至剪贴板,如果想要避免,可以设置exportselection=0.
(6) fg或foreground:前景色彩。
(7) font:字形
(8) height:高,单位时字符高
(9) highlightbackground:当文本框取得焦点时背景颜色。
(10) highlightcolor:当文本框取得焦点时的颜色。
(11) justify:当含多行文字时,最后一行的对齐方式。
(12) relief:默认是relief=FLAT,可由此控制文字外框。
(13) selectbackground:被选取字符串的背景色彩
(14) selectborderwidth:选取字符串时的边界宽度,预设是1。
(15) selectfroeground:被选取字符串的前景色彩。
(16) show:显示输入字符,例如,show='*'表示显示星号,常用作输入密码字段。
(17) state:输入状态,默认是NORMAL表示可以输入,DISABLE则表示无法输入。
(18) textvariable:文字变量。
(19) width:宽,单位是字符宽。
(20) xscrollcommand:在x轴使用滚动条
下面程序,在窗口内建立标签和文本框,输入姓名和地址。
python
from tkinter import *
root = Tk()
root.title("ch5_1")
nameL = Label(root, text="Name ")
nameL.grid(row=0)
addressL = Label(root, text="Address ")
addressL.grid(row=1)
nameE = Entry(root)
addressE = Entry(root)
nameE.grid(row=0, column=1)
addressE.grid(row=1, column=1)
root.mainloop()
运行结果

上述代码中设置grid(row=0),在没有设置"column=x"的情况下,系统将自动设置"column=0"。
5-2 使用show参数隐藏输入的字符
其实Entry控件具有可以使用show参数设置隐藏输入字符的特性,所以也常被应用与密码的输入控制。
下面程序中模拟登录界面,有输入账号和密码,当输入密码时所输入的字符将隐藏并用"*"字符显示。
python
from tkinter import *
root = Tk()
root.title("ch5_2")
accountL = Label(root, text="Account ")
accountL.grid(row=0)
pwdL = Label(root, text="Password ")
pwdL.grid(row=1)
accountE = Entry(root)
pwdE = Entry(root, show='*')
accountE.grid(row=0, column=1)
pwdE.grid(row=1, column=1)
root.mainloop()
运行结果

下面代码建立一个公司网页登录界面。
python
from tkinter import *
root = Tk()
root.title("ch5_3")
msg = "欢迎进入Silicon Stone Education系统"
Png = PhotoImage(file="tubiao.png")
logo = Label(root, image=Png, text=msg, compound=BOTTOM)
accountL = Label(root, text="Account")
accountL.grid(row=1)
pwdL = Label(root, text="Password ")
pwdL.grid(row=2)
logo.grid(row=0, column=0, columnspan=2, padx=10, pady=11)
accountE = Entry(root)
pwdE = Entry(root, show='*')
accountE.grid(row=1, column=1)
pwdE.grid(row=2, column=1, padx=10)
root.mainloop()
执行结果

5-3 Entry的get()方法
Entry有一个get()方法,可以利用这个方法获得目前Entry的字符串内容。Widget控件有一个常用方法Quit,执行此方法时Python Shell窗口的程序将结束,但是此窗口应用程序继续运行。
扩展上面网页的登录页面,增加Login和Quit功能按钮。如果单击Login功能按钮,在Python Shell中将列出所输入的Account和Password;若是单击Quit按钮,则Python Shell窗口执行结束,但是屏幕上仍可以看到此窗口在执行。
python
from tkinter import *
def printInfo():
print("Account: ", accountE.get())
print("Password: ", pwdE.get())
root = Tk()
root.title("ch5_4")
msg = "欢迎进入Silicon Stone Education系统"
Png = PhotoImage(file="tubiao.png")
logo = Label(root, image=Png, text=msg, compound=BOTTOM)
accountL = Label(root, text="Account")
accountL.grid(row=1)
pwdL = Label(root, text="Password ")
pwdL.grid(row=2)
logo.grid(row=0, column=0, columnspan=2, padx=10, pady=11)
accountE = Entry(root)
pwdE = Entry(root, show='*')
accountE.grid(row=1, column=1)
pwdE.grid(row=2, column=1, padx=10)
# 以下建立Login和Quit按钮
loginbtn = Button(root, text="Login", command=printInfo)
loginbtn.grid(row=3, column=0)
quitbtn = Button(root, text="Quit", command=root.quit)
quitbtn.grid(row=3, column=1)
root.mainloop()
运行结果

从上述结果可以看到,Login按钮和Quit按钮并没有对齐上方的标签和文本框,我们可以在grid()方法内增加sticky参数,同时将此参数设为W,即可靠左对齐字段。
下面使用sticky=W参数和padx=10参数,重新设计上面代码。
python
from tkinter import *
def printInfo():
print("Account: ", accountE.get())
print("Password: ", pwdE.get())
root = Tk()
root.title("ch5_4")
msg = "欢迎进入Silicon Stone Education系统"
Png = PhotoImage(file="tubiao.png")
logo = Label(root, image=Png, text=msg, compound=BOTTOM)
accountL = Label(root, text="Account")
accountL.grid(row=1)
pwdL = Label(root, text="Password ")
pwdL.grid(row=2)
logo.grid(row=0, column=0, columnspan=2, padx=10, pady=10)
accountE = Entry(root)
pwdE = Entry(root, show='*')
accountE.grid(row=1, column=1)
pwdE.grid(row=2, column=1, padx=10)
# 以下建立Login和Quit按钮
loginbtn = Button(root, text="Login", command=printInfo)
loginbtn.grid(row=3, column=0, sticky=W, padx=5)
quitbtn = Button(root, text="Quit", command=root.quit)
quitbtn.grid(row=3, column=1, sticky=W, padx=10)
root.mainloop()
运行结果

5-4 Entry的insert()方法
在设计GUI程序时,常常需要在建立Entry的文本框内默认建立输入文字,在Widget的Entry控件中可以使用insert(index, s)方法插入字符串,其中,s时所插入的字符串,字符串会插入在index位置。设计程序时可以使用这个方法为文本框建立默认的文字,通常会将它放在Entry()方法建立完文本框后。
下面程序为Account文本框建立默认文字为"Kevin",为password文本框建立默认文字为"pwd"
python
accountE = Entry(root)
pwdE = Entry(root, show='*')
accountE.insert(0, "Kevin")
pwdE.insert(0, "123")
运行结果

5-5 Entry的delete()方法
在tkinter模块的应用中可以使用delete(first, last=None)方法删除Entry内的从第first字符到第last-1字符间的字符串,如果要删除整个字符串可以使用delete(0, END)。
下面程序扩展了上面的程序,当单击Login按钮后,清空文本框Entry中的内容
python
def printInfo():
print("Account: ", accountE.get())
print("Password: ", pwdE.get())
accountE.delete(0, END)
pwdE.delete(0, END)
运行结果

5-6 计算数学表达式使用eval()
Python内有一个非常好用的计算数学表达式的函数eval,该函数可以直接传回此数学表达式的计算结果。它的语法如下。
python
result = eval(expression) # express 是字符串
上述计算结果也是用字符串传回。
下面代码中输入数学表达式,本程序会传回执行结果
python
expression = input("请输入数学表达式: ")
print("结果是: ", eval(expression))
运行结果
bash
PS E:\code\python\GuiTkinter\ch5> python .\ch5_1.py
请输入数学表达式: 9*10+8
结果是: 98
PS E:\code\python\GuiTkinter\ch5>
了解了eval()函数的用法后,可以将上述程序改为GUI程序。
python
from tkinter import *
def cal():
out.configure(text="结果: " + str(eval(equ.get())))
root = Tk()
root.title("ch5_9")
label = Label(root, text="请输入数学表达式:")
label.pack()
equ = Entry(root)
equ.pack(pady=5)
out = Label(root)
out.pack()
btn = Button(root, text="计算", command=cal)
btn.pack(pady=5)
root.mainloop()
运行结果
