生命在于折腾:用Python写一个编辑器

君子不器 2014年03月24日 编程世界 4023次阅读 查看评论

一时闲极无聊,想把心仪已久的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()  

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

« 上一篇 下一篇 » 君子不器原创文章,转载请注明出处! 标签:小工具Javahtml文摘

相关日志:

博主介绍
乌云蔽月,人迹踪绝,说不出如斯寂寞。
控制面板
您好,欢迎到访网站!
  [查看权限]
站点信息
  • 文章总数:1279
  • 页面总数:2
  • 分类总数:9
  • 标签总数:61
  • 评论总数:331
标签列表
友情链接