文本输入框是GUI编程中最常用的输入形式,Tkinter为此提供了Entry类。先看程序执行结果:

Tkinter编程应知应会(8)-创建和使用单行文本输入框_面向对象

首先是构建Entry对象,同样的手法,差不多的结果。


 


 

# create font
ftTimes = Font(family='Times', size=24, weight=BOLD)
# create a label to change state.
entry = Entry(root,
background="#a0ffa0",foreground="#000000",
disabledbackground="#7f7f7f",disabledforeground="#000000",
font=ftTimes, width=32)
entry.grid(row=0, column=0, columnspan=2)

接下来构建一个多行标签对象处理表示键盘事件:


 


 

# create text variable.
str_var = StringVar()
# create a label to change state.
label = Label(root,height=10, justify=LEFT, textvariable=str_var)
label.grid(row=1, column=0, columnspan=2)

接下来为Entry对象绑定按键按下事件。代码的内容是将事件的信息转换为文字列再设置到前面构建的多行标签上。


 


 

# bind event
def OnKeyPress(e):
print(e)
current = str_var.get()
if len(current):
str_var.set(current + '\n' + str(e))
else:
str_var.set(str(e))
entry.bind('<KeyPress>', OnKeyPress)

同样的转换状态按钮:


 


 

# change state function.
def change_state():
state = entry.cget('state')
if state=='disabled':
entry.config(state='normal')
elif state=='normal':
entry.config(state='readonly')
else:
entry.config(state='disabled')
# change state button.
Button(root,text="State", command=change_state).grid(row=2, column=0, sticky=E+W)

删除选择文本的代码信息量比较大,稍微详细一点说明。


 


 

# delete selection.
def delete_selection():
anchor = entry.index(ANCHOR)
if anchor: # there is a selection
# current position of the insertion cursor
insert = entry.index(INSERT)
sel_from = min(anchor, insert)
sel_to = max(anchor, insert)
# delete the selection.
entry.delete(sel_from, sel_to)
# delete selection button.
Button(root,text="Delete", command=delete_selection).grid(row=2, column=1, sticky=E+W)

ANCHOR是表示选择文字开始位置的常数,有了这个常数我们就可以使用index方法取得第一个被选字符的索引;INSERT是表示插入光标位置的常数,利用这个常数,我们可以使用index方法取得光标位置的索引。当用户如下选择的时候:

Tkinter编程应知应会(8)-创建和使用单行文本输入框_微信公众号_02

被选文字的开始索引为1,光标位置的索引为6。用户也可能这样选:

Tkinter编程应知应会(8)-创建和使用单行文本输入框_微信公众号_03

这时被选文字的开始索引为6,光标位置的索引为1。

无论哪种情况,我们都可以删除从两个值的最小值开始到最大值范围的内容以实现选择文字的删除。当然了实际上你只要按一下delete键就可以完成同样的功能,这里只是为了展示Entry的用法。

 


关注微信公众号【面向对象思考】