Text.Get('1.'0' END)
eg:通过hashlib.md5 -- 检测内容变动
from tkinter import *
import hashlib
root = Tk()
text = Text(root, width=20, height=10)
text.pack()
text.insert('1.0', 'Love is burn into peace')
contents = text.get('1.0', END)
def getSig(contents):
m = hashlib.md5(contents.encode())
return m.digest()
org = getSig(contents)
def check():
new_content = text.get('1.0', END)
if org != getSig(new_content):
print('情况有变,小心traitor!')
else:
print('一切如旧~')
Button(root, text='稽查', command=check).pack()
mainloop()
Text.Search()
search(pattern, index, stopindex=None, forwards=None, backwards=None, exact=None, regexp=None, nocase=None, count=None)
-- 从 index 开始搜索 pattern,到 stopindex 结束(不指定表示搜索到末尾)
-- 如果成功找到,以 "line.column" 返回第一个匹配的字符;否则返回空字符串
-- forwards 参数设置为 True 表示向前(->)搜索
-- backwards 参数设置为 True 表示向后(<-)搜索
-- exact 参数设置为 True 表示搜索与 pattern 完全匹配的结果
-- regexp 参数设置为 True,则 pattern 被解释为 Tcl 格式的正则表达式
-- nocase 参数设置为 True 是忽略大小写,默认是区分大小写的搜索
-- count 参数指定为一个 IntVar 的 Tkinter 变量,用于存放当找到匹配的字符个数(如果匹配结果中没有嵌入的 image 或 window 对象的话,一般该值等于 pattern 的字符个数)
Eg: 查找字符串
from tkinter import *
root = Tk()
text = Text(root, width=20, height=10)
text.pack()
text.insert('1.0', 'Love is burn into peace')
def getIndex(text, inx):
return tuple(map(int, text.index(inx).split('.')))
start = '1.0'
while True:
loc= text.search('o', start, stopindex=END) #查找到第一个结果后返回line.num并停止
if not loc: #找不到结果时终止循环
break
print('found it in ', getIndex(text, loc))
start = loc + '+1c' #向后移动一个字节,继续查找
mainloop()
撤销 和 恢复
通过设置 undo 选项为 True 可以开启 Text 组件的“撤销”功能。然后用 edit_undo() 方法实现“撤销”操作,用 edit_redo() 方法实现“恢复”操作。
这是因为 Text 组件内部有一个栈专门用于记录内容的每次变动,所以每次“撤销”操作就是一次弹栈操作,“恢复”就是再次压栈。
默认情况下,每一次完整的操作将会放入栈中。但怎么样算是一次完整的操作呢?Tkinter 觉得每次焦点切换、用户按下 Enter 键、删除\插入操作的转换等之前的操作算是一次完整的操作。也就是说你连续输入“FishC 是个 P”的话,一次的“撤销”操作就会将所有的内容删除。
做法就是先将 autoseparators 选项设置为 False(因为这个选项是让 Tkinter 在认为一次完整的操作结束后自动插入“分隔符”),然后绑定键盘事件,每次有输入就用 edit_separator() 方法人为地插入一个“分隔符”,这样插入一个字符就算一次完整的操作,然后每次点击“撤销”就去掉一个字符。
edit_redo(self)
-- “恢复”上一次的“撤销”操作
-- 如果 undo 选项为 False,该方法无效
-- 详见上方用法【“撤销”和“恢复”操作】
edit_separator()
-- 插入一个“分隔符”到存放操作记录的栈中,用于表示已经完成一次完整的操作
-- 如果 undo 选项为 False,该方法无效
-- 详见上方用法【“撤销”和“恢复”操作】
edit_undo()
-- 撤销最近一次操作
-- 如果 undo 选项为 False,该方法无效
-- 详见上方用法【“撤销”和“恢复”操作】
EG:
from tkinter import *
import hashlib
root = Tk()
# 'undo=True' 激活撤销/恢复功能
# 'autoseparators=False' 关闭自动设置separator设置
text = Text(root, width=30, height=10, undo=True, autoseparators=False, maxundo=10)
text.pack()
def typing(event):
text.edit_separator()
def undo():
text.edit_undo()
def redo():
text.edit_redo()
text.bind('<Key>', typing) #绑定键盘按键,每次点击都设置separator,方便undo/redo
text.insert('1.0', 'Love is burn into peace')
Button(root, text='UNDO', command=undo).pack()
Button(root, text='REDO', command=redo).pack()
mainloop()