本文介绍Entry控件,Entry控件使用户输入单行文本,例如,用户名,密码等。
前面我介绍过Text控件用来显示多行文本且用户可编辑;如果想显示多行文本但用户不能编辑,就使用Label控件。
文章目录
首先通过一个例子来引入Entry控件,说明,博客中的实例代码都没有封装,使用最直接的方式,目的是为了直观的介绍知识点,可根据具体业务自行封装以便调用。
Entry的引入
pack布局
from tkinter import Tk,Entry,Label,Frame
main_win = Tk()
main_win.title('渔道的Entry控件')
width = 300
height = 300
main_win.geometry(f'{width}x{height}')
# 使用pack布局
user_name = Label(main_win, text='user name')
user_name.pack(side='left', anchor='nw')
user_name_entry = Entry(main_win, bd=5)
user_name_entry.pack(side='right', anchor='ne')
password = Label(main_win, text='password')
password.pack(side='left', anchor='nw')
password_entry = Entry(main_win, bd=5)
password_entry.pack(side='right', anchor='ne')
main_win.mainloop()
发现使用pack布局 达不到预期的效果(你可以自行调整布局参数),这个例子就体现了pack布局的局限性。
Frame+pack布局
前面介绍过Frame控件,看看能否结合Frame使布局更好一些。
from tkinter import Tk,Entry,Label,Frame
main_win = Tk()
main_win.title('渔道的Entry控件')
width = 300
height = 300
main_win.geometry(f'{width}x{height}')
# 使用frame+pack布局
frame_user_name = Frame(main_win, background='yellow', borderwidth=5)
frame_user_name.pack(fill='x')
user_name = Label(frame_user_name, text='user name')
user_name.pack(side='left', anchor='nw')
user_name_entry = Entry(frame_user_name, bd=5)
user_name_entry.pack(side='right', anchor='nw')
frame_password = Frame(main_win, background='blue', borderwidth=5)
frame_password.pack(fill='x')
password = Label(frame_password, text='password')
password.pack(side='left')
password_entry = Entry(frame_password, bd=5)
password_entry.pack(side='right')
main_win.mainloop()
使用Frame+pack布局,显示效果好了很多。frame_user_name使用fill属性填充x方向,user_name和user_name_entry在Frame内部使用pack布局。从这个例子我们可以进一步理解到,pack布局的思想是"平均",即所有的控件都均匀分布,programmer的控制权相对有限。
grid布局
from tkinter import Tk,Entry,Label,Frame
main_win = Tk()
main_win.title('渔道的Entry控件')
width = 300
height = 300
main_win.geometry(f'{width}x{height}')
user_name = Label(main_win, text='user name')
user_name.grid(row=0, column=0)
user_name_entry = Entry(main_win, bd=5)
user_name_entry.grid(row=0, column=1)
password = Label(main_win, text='password')
password.grid(row=1,column=0)
password_entry = Entry(main_win, bd=5)
password_entry.grid(row=1, column=1)
main_win.mainloop()
使用grid布局,和我的期望效果一致。
place布局
from tkinter import Tk,Entry,Label,Frame
main_win = Tk()
main_win.title('渔道的Entry控件')
width = 300
height = 300
main_win.geometry(f'{width}x{height}')
user_name = Label(main_win, text='user name')
user_name.place(x=0)
user_name_entry = Entry(main_win, bd=5)
user_name_entry.place(x=70)# x的单位是像素
password = Label(main_win, text='password')
password.place(x=0,y=30)
password_entry = Entry(main_win, bd=5, show="*")
password_entry.place(x=70, y=30)
main_win.mainloop()
使用place布局,也可以达到期望的效果。
Entry在tkinter中有36中属性,下面仅展示一些常用属性的使用。
background/bg
password_entry = Entry(main_win, bd=5, bg='yellow')
borderwidth/bd
password_entry = Entry(main_win, bd=5, bg='yellow')
cursor
password_entry = Entry(main_win, bd=5, bg='yellow', cursor='cross')
foreground/fg
password_entry = Entry(main_win, bd=5, bg='yellow', cursor='cross', fg='red')
show
show属性隐藏实际文本内容,使用show的值显示
password_entry = Entry(main_win, bd=5, bg='yellow', cursor='cross', fg='red', show='*')
state
state属性用来获取和设置Entry是否可输入。normal
, disabled
, readonly
三种值。
password_entry = Entry(main_win, bd=5, bg='yellow', cursor='cross', fg='red', show='*')
print(password_entry['state']) # 输出 'normal'
password_entry = Entry(main_win, bd=5, bg='yellow', cursor='cross', fg='red', show='*')
password_entry.insert(0, '123456')
password_entry['state']='disabled'
print(password_entry['state']) # 输出 'disabled'
可以看到,password对应的Entry的颜色变成灰色,不能输入。
textvariable
动态设置Entry文本内容
username = StringVar(user_name_entry, 'frank')
user_name_entry['textvariable'] = username