Python寫的一個編輯器

jopen 10年前發布 | 17K 次閱讀 Python Python開發

一時閑極無聊,想把心儀已久的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的名字.

Python寫的一個編輯器

既然是功能模塊,那么象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截圖:

Python寫的一個編輯器

看著象點樣子了吧,這里用到了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()

到這里,一個極其簡陋的文本編輯器已經完成,但是這不是最終形態,之后將陸續對這個簡單粗暴的文本編輯器進行改造優化.
來自:http://my.oschina.net/ox16/blog/210490

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!