生命在于折腾 ---- 写一个编辑器

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

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

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

     简单直接粗暴有效的function

#-*-coding:utf8 -*-
__version__=0.1
__author__ ="Alycat"

import sys

class 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的名字.

image

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

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

#-*-coding:utf8 -*-
__version__ = 0.1
__author__  = "Alycat"

import sys
from 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截图:

image

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

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


#-*-coding:utf8 -*-
__version__=0.1
__author__ ="Alycat"

import sys,tkFileDialog,os
from 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()

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

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看