blog

Pythonでエディターを書く!

アイドル退屈の瞬間は、長い間所望のPythonの良い学習を置きたいと思います。彼らの技術を磨くためにテキストエディタを行うために手をつないで。...

Jan 19, 2015 · 8 min. read
シェア

退屈だったので、長い間楽しみにしていたpythonを学びたいと思いました。スキルを磨くためにテキストエディタを作りたいです。

テキストエディタを作るという目標を設定したら、コーディングを始めましょう。ミニマリストのテキストエディタは、テキストを開き、テキストを編集し、保存し、終了するだけのシンプルな機能です。

シンプル、直接的、効果的な機能

#-*-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を追加します。 上記のコードは、このアプリケーションの機能モジュールのテキストエディタとして使用されますので、テキストの内容は、UIにキャッシュされます変更します。

私はjavaに慣れていて、無意識のうちに関数の周りにクラスを付けていますが、実際にこのクラスは必要なのでしょうか? pythonのオンラインここで 見ると、モジュールをインポートするときにやるべきことは2つあり、対象のモジュールを照会して初期化することと、現在のスクリプトでモジュール名を定義することです。

関数モジュールなので、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のスクリーンショットです:

少し似ていますが、ここではこの2つのWidgetのMenuとTextを使用し、具体的な紹介は公式ドキュメントをご覧ください。

次のステップは、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()  

ここでは、非常にシンプルなテキストエディタが完成していますが、これは最終形ではなく、シンプルなテキストエディタが変形され、最適化された後です。

Read next

ビッグデータが米国の医療制度を破壊する

米国の医療制度が大失敗に終わった原因の一つは、ビッグデータの軽視です。ビッグデータが米国の医療制度を変えたのであって、良くなったわけではありません。

Jan 19, 2015 · 2 min read