博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生命在于折腾 ---- 写一个编辑器
阅读量:6702 次
发布时间:2019-06-25

本文共 3887 字,大约阅读时间需要 12 分钟。

  hot3.png

一时闲极无聊,想把心仪已久的python好好学习学习.随手做个文本编辑器来磨练下自己的手艺.

     定好目标要做个文本编辑器后,就可以开始coding了.一个极简的文本编辑器,只需要打开文本,编辑文本,保存,退出这么几个简单的功能(这里暂时不考虑编码,文件内容查找之类的问题).

     简单直接粗暴有效的function

#-*-coding:utf8 -*-__version__=0.1__author__ ="Alycat"import sysclass Note():	'''		This fname is file name with full path	'''	def openFile(self,fname=None):		if fname is None:			return -1		self.fname = fname		file = open(fname,'r+')		content = file.read()		file.close()		return content	def saveFile(self,content=None):		if content is None:			return -1		file=open(self.fname,'w')		file.write(content)		file.flush()		file.close()		return 0	def exit(self):		sys.exit(0)

这个文本编辑器最终形态必定不是运行在黑窗口下类似Vi和Emasc的存在,所以在以后会慢慢给她添上GUI.以上的code将会作为文本编辑这个应用的功能模块,所以修改文本内容将缓存在UI里.

习惯了java,下意识在function外围上了class,实际上需要这个class么? 从python的在线文档 (oschina居然可以直接看doc,点赞)可以看到,在import module时会做2件事,查询并初始化这个目标module然后在当前脚本定义该module的名字.

既然是功能模块,那么象open,save,exit这些功能能不能直接用而不需要初始化Note这个对象呢?这个问题暂时放在一边,这个编辑器到现在只有几个简单的功能连UI都还没有,接下来就开始做个界面.

在大多数情况下,开发一个本地应用最简单的做法就是界面绑定功能,先做出界面再配合界面完善功能.在Python里做界面有几种做法,官方的Lib中默认的GUI库是用Tcl/Tk,在有相关的介绍.其次用的比较广泛的是wxPython,PyQT等等. 为了配合我们编辑器简单粗暴的做法,我们就使用官方自带的GUI库来定制界面.对刚才的代码添加上简单的界面:

#-*-coding:utf8 -*-__version__ = 0.1__author__  = "Alycat"import sysfrom Tkinter import *class Note():		def __init__(self):		self.tk=Tk()		self.createUI()		self.tk.mainloop()	def createUI(self):		#create menu		menubar=Menu(self.tk)		fmenu=Menu(menubar,tearoff=0)		fmenu.add_command(label='Open')		fmenu.add_command(label='Save')		fmenu.add_command(label='Exit')		menubar.add_cascade(label="File", menu=fmenu)		self.tk.config(menu=menubar)		self.text=Text()		self.text.pack()	'''		The fname is file name with full path	'''	def openFile(self,fname=None):		if fname is None:			return -1		self.fname = fname		file = open(fname,'r+')		content = file.read()		file.close()		return content	def saveFile(self,content=None):		if content is None:			return -1		file=open(self.fname,'w')		file.write(content)		file.flush()		file.close()		return 0	def exit(self):		sys.exit(0)if __name__ == '__main__':	Note()

这是UI截图:

看着象点样子了吧,这里用到了Menu和Text这2个Widget,具体的介绍可以看官方文档.

接下来就是把UI和之前的功能衔接起来,这里需要有一个地方需要做些修改,在保存和打开文件时,需要用户去定位文件路径和文件名.废话少说,继续粗暴的路线:

#-*-coding:utf8 -*-__version__=0.1__author__ ="Alycat"import sys,tkFileDialog,osfrom Tkinter import *class Note():         def __init__(self):          self.tk=Tk()          self.createUI()          self.tk.mainloop()     def createUI(self):          #create menu          menubar=Menu(self.tk)          fmenu=Menu(menubar,tearoff=0)          fmenu.add_command(label='Open',command=self.open)          fmenu.add_command(label='Save',command=self.save)          fmenu.add_command(label='Exit',command=exit)          menubar.add_cascade(label="File", menu=fmenu)          self.tk.config(menu=menubar)          self.text=Text()          self.text.pack()         def save(self):        txtContent = self.text.get(1.0,END)        self.saveFile(content=txtContent)              def open(self):          self.filename = tkFileDialog.askopenfilename(initialdir = os.getcwd())          filecontent=self.openFile(fname=self.filename)          if filecontent is not -1:               self.text.delete(1.0,END)               self.text.insert(1.0,filecontent)     '''          The fname is file name with full path     '''     def openFile(self,fname=None):          if fname is None:               return -1          self.fname = fname          file = open(fname,'r+')          content = file.read()          file.close()          return content     def saveFile(self,content=None):          if content is None:               return -1          file=open(self.fname,'w')          file.write(content)          file.flush()          file.close()          return 0     def exit(self):          sys.exit(0)if __name__ == '__main__':     Note()

到这里,一个极其简陋的文本编辑器已经完成,但是这不是最终形态,之后将陆续对这个简单粗暴的文本编辑器进行改造优化.

转载于:https://my.oschina.net/ox16/blog/210490

你可能感兴趣的文章
【安全牛学习笔记】CONTROL FRAME
查看>>
信号量 互斥锁 条件变量的区别(讲的很好,值得收藏)
查看>>
Linux学习笔记十二周四次课(4月26日)
查看>>
Linux之用户管理
查看>>
写一个shell脚本,把192.168.0.0/24网段在线的ip列出来。 思路: for循环, 0
查看>>
JDK安装与环境变量配置
查看>>
多字符与宽字符相互之间的转换
查看>>
CentOS 7.3 mini 解压安装二进制 mariadb 10.2.10
查看>>
RAD Studio增书签功能 单一窗口就可检视受标记
查看>>
硬盘基本知识(一)
查看>>
Python故事——three(附)
查看>>
ACL
查看>>
Kubernetes 通过statefulset部署redis cluster集群
查看>>
Mac安装Thrift
查看>>
Shell基础:介绍、历史命令、命令不全和别名、通配符、输入输入重定向、管道发和作业控制...
查看>>
【Linux】开源系统监控方案:Observium
查看>>
django 内置验证登录模块(auth login logout authenticate)测试
查看>>
小工具
查看>>
在VM虚拟机中安装Redhat6.5 / CentOs6.5
查看>>
用SVN、LNMP和MySQL三种环境 部署一个社交网站
查看>>