frame越过另一个frame_Python3.6实现一个简单的文本编辑器

今天做一个简单的文本编辑器,主要实现如下功能:

  1. 可以打开一个文本文件。
  2. 可以编辑并保存修改后的文件。
  3. 可以实现剪切和粘贴等简单操作。
  4. 可以实现查找操作并自动定位到查找内容所在位置。

代码运行效果如图所示:

c6c0dfa99b7b62113dff8a17cfef9296.png

显示文本内容

全部代码如下:

  1. 编写一个ScrolledText类,并作为一个模块用于后面调用。
print('scrolledtext')from tkinter import *class ScrolledText(Frame): def __init__(self,parent=None,text='',file=None): Frame.__init__(self,parent) self.pack(expand=YES,fill=BOTH) self.makewidgets() self.settext(text,file) def makewidgets(self): sbar=Scrollbar(self) text=Text(self,relief=SUNKEN) sbar.config(command=text.yview) text.config(yscrollcommand=sbar.set) sbar.pack(side=RIGHT,fill=Y) text.pack(side=LEFT,expand=YES,fill=BOTH) self.text=text def settext(self,text='',file=None): if file: text=open(file,'r').read() self.text.delete('1.0','end') # 将file文件中的所有内容清除;1.0表示第1行第0列(行数从1开始,列数从0开始,2.1表示第2行中第2个字符) self.text.insert('1.0',text) # 从起始位置开始将text中的内容写入到file文件 self.text.mark_set(INSERT,'1.0') # 将光标插入到文本的开头位置(INSERT是一个预定义的标志,用于确认光标位置) self.text.focus() def gettext(self): return self.text.get('1.0',END+'-1c') # END+'-1c'即"end-1c",意为从END往回数第一个字符,由于END指向的是字符串最后一个字符后面的位置,因此,该表达式实际指向的就是最后一个字符本身
fd0dae019b7e91a413e82bdfd7a89985.png

保存文本文件

2.编写一个标准退出按钮的类(后面会直接通过调用模块来使用):

from tkinter import *from tkinter.messagebox import askokcancelclass Quitter(Frame): def __init__(self,parent=None): Frame.__init__(self,parent) self.pack() widget=Button(self,text='Quit',command=self.quit) widget.pack(side=LEFT,expand=YES,fill=BOTH) def quit(self): ans=askokcancel('Verify exit','Really quit?') if ans:Frame.quit(self)
8352bbb4b75ea2a1ea3f7749ce95dd5d.png

剪切效果

3.编写主代码:

from tkinter import *from tkinter.simpledialog import askstringfrom tkinter.filedialog import asksaveasfilenamefrom quitter import Quitterfrom scrolledtext import ScrolledTextclass SimpleEditor(ScrolledText): def __init__(self,parent=None,file=None): frm=Frame(parent) frm.pack(fill=X) Button(frm,text='Save',command=self.onSave).pack(side=LEFT) Button(frm,text='Cut',command=self.onCut).pack(side=LEFT) Button(frm,text='Paste',command=self.onPaste).pack(side=LEFT) Button(frm,text='Find',command=self.onFind).pack(side=LEFT) Quitter(frm).pack(side=LEFT) ScrolledText.__init__(self,parent,file=file) self.text.config(font=('courier',9,'normal')) def onSave(self): filename=asksaveasfilename() if filename: alltext=self.gettext() open(filename,'w').write(alltext) def onCut(self): text=self.text.get(SEL_FIRST,SEL_LAST) self.text.delete(SEL_FIRST,SEL_LAST) self.clipboard_append(text) def onPaste(self): try: text=self.selection_get(selection='CLIPBOARD') # 获取粘贴板里面的内容 self.text.insert(INSERT,text) # 在光标位置处插入粘贴板中的内容 except TclError: pass def onFind(self): target=askstring('SimpleEditor','Search String?') if target: where=self.text.search(target,INSERT,END) # 从光标位置开始到结尾的范围内搜索askstring获取到的字符串target的位置 if where: print(where) pastit=where+('+%dc'%len(target)) # pastit代表从搜索到的target的位置到target字符结束的位置(即target) self.text.tag_add(SEL,where,pastit) # 将target所在的字符位置标记(颜色加深,即蓝色选中效果) self.text.focus() self.text.see(pastit) # 实现滚动显示,该语句可以滚动并显示查找的字符串所在的位置
7f9c89a6a02cb4d9eaea66f827d6de5a.png

黏贴效果

编写调用代码:

if __name__=='__main__': if len(sys.argv)>1: SimpleEditor(file=sys.argv[1]).mainloop() else: SimpleEditor().mainloop()
2a24d20344ce78eee01ef6f29d36a8c4.png

查找效果

4.编辑一个用于测试的文本文件,可以通过python代码快速实现:

f=open('jack.txt','w')for i in range(250): f.write('%03d All work and no play makes Jack a dull boy.'%i)f.close()
920e06ac46afb6fa211eb4a568fa42d3.png

查找效果

由于调用了sys.argv标准输入,因此可以在CMD窗口中通过命令python scripy.py jack.txt来打开jack.txt文件,并完成相关测试。

35a31b3398fe7afadf23f5cdd1ecd978.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值