Tkinter编程应知应会(14)-文本编辑控件Text
原创
©著作权归作者所有:来自51CTO博客作者大连木匠的原创作品,请联系作者获取转载授权,否则将追究法律责任
不同于Entry控件只能支持一行输入,文本编辑控件Text除了支持多行显示和编辑之外,同时支持撤销和重做,以及对于不同的部分设定不同的格式。本文的实例会介绍这些功能。以下是演示视频:
Enbale按钮用于切换Text控件是否允许用户的编辑操作。由于Text的表示颜色不会因为状态的不同而不同,因此代码同时会调整Text控件的表示颜色。
# change state function.def change_state(): state = text.cget('state') if state=='disabled': text.config(state='normal') text.config(background='#a0ffa0') else: text.config(state='disabled') text.config(background='#efefef')# change state button.eb = Button(root,text="Enable", width=8, command=change_state)eb.grid(row=0, column=0, sticky=E+W)
Delete按钮用于删除选择内容。需要注意的是Text控件取得选择内容的方式和Entry不同。
# delete selection.def delete_selection(): try: sel_from = text.index(SEL_FIRST) sel_to = text.index(SEL_LAST) # delete the selection. text.delete(sel_from, sel_to) except TclError: pass
# delete selection button.db = Button(root,text="Delete", width = 8, command=delete_selection)db.grid(row=0, column=1, sticky=E+W)
Undo和Redo按钮直接使用Text的方法即可实现撤销和重做功能。代码中使用了lambda表达式以简化调用。
# undo buttonundo = Button(root, text='Undo', width = 8, command=lambda:text.edit_undo())undo.grid(row=0, column = 2, sticky=E+W)#redo buttonredo = Button(root, text='Redo', width = 8, command=lambda:text.edit_redo())redo.grid(row=0, column = 3, sticky=E+W)
设置格式的按钮一共有四个,它们共用一套处理逻辑,各个按钮使用不同的参数调用同一个format函数。
# create fontsfonts = [ Font(family='SimHei', size=20, weight=BOLD), Font(family='SimHei', size=16), Font(family='SimSun', size=12, weight=BOLD), Font(family='SimSun', size=12) ]
# delete selection.def format(index): tag_name = 'Format' + str(index) try: sel_from = text.index(SEL_FIRST) sel_to = text.index(SEL_LAST) for name in text.tag_names(): text.tag_remove(name, sel_from, sel_to) text.tag_add(tag_name, sel_from, sel_to) # set format at first time。 range_count = len(text.tag_ranges(tag_name)) if range_count == 2: text.tag_config(tag_name, font=fonts[index]) except TclError: pass
# delete selection button.for i in range(0, 4): fb = Button(root, text="Format" + str(i), width = 8, command=lambda v=i : format(v)) fb.grid(row=1, column=i, sticky=E+W)
代码中使用了tag_remove、tag_add、tag_config和tag_names方法实现了简单的格式设定功能。
最后构建Text控件。需要注意的是,undo属性的值被指定为True,以令撤销和重做功能有效。
# create text widget.text = Text(root, undo=True, background="#a0ffa0", foreground="#000000", height = 10)text.grid(row=2 , column=0, columnspan=8)
一个比较遗憾的事实是,设定文本格式的动作并没有包含在重做和撤销的处理范围内。
完整代码可以从下面的链接下载:
https://github.com/xueweiguo/TkinterPrimer/blob/master/Sample/14%20Text.py
觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】