2025年11月3日月曜日

超シンプルテキストエディタを作ってみた

コピペもアンドゥもできず、なにかあってもダイアログすら表示しません。
セーブとロードのみできますが、拡張子は .txt のみ。

ソースここから

## TextEditor ##

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput

from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty
from kivy.uix.popup import Popup

from kivy.uix.filechooser import FileChooserIconView
from kivy.uix.filechooser import FileChooserListView

import japanize_kivy

import os
from os.path import join,isdir

pathDef = ("/home/")
SUFFIX = (".txt","*.txt")

#class DirectoryChooser(FileChooserListView):
class DirectoryChooser(FileChooserIconView):
    def is_dir(self,directory,filename):
        return isdir(join(directory,filename))

# [ファイル選択画面へ]
class BtnTransferLoadFile(Button):
    def on_release(self):
        self.parent.DrawLoadFile()

# [ディレクトリ選択/ファイル名決定画面へ]
class BtnTransferSaveFile(Button):
    def on_release(self):
        self.parent.DrawSaveFile()

# [ファイル読み込み]親ウィンドウ全削除→ファイルを読み込んで基本画面
class BtnLoadFile(Button):
    def on_release(self):
        strPath = '\n'.join(self.parent.fc.selection)

        if os.path.exists(strPath):
            with open(strPath,'r') as f:
                self.parent.txEdit.text = f.read()
                self.parent.parent.lFile.text=strPath

        self.parent.DrawBase()

# [ファイル書き込み]親ウィンドウ全削除→ファイルを書き込んで基本画面
class BtnSaveFile(Button):
    def on_release(self):
        while self.parent.txFile.text != "":
            strPath = self.parent.dc.path+os.sep+self.parent.txFile.text+SUFFIX[0]

            with open(strPath,'w') as f:
                outputtext = f.write(self.parent.txEdit.text)
                self.parent.parent.lFile.text = strPath
            break
            
        self.parent.DrawBase()
        
# [基本画面へ]親ウィンドウ全削除→基本画面
class BtnQuit(Button):
    def on_release(self):
        self.parent.DrawBase()
        
# メインフレームの中にあるウィンドウ
class SubDisplay(BoxLayout):
    def __init__(self,**kwargs):
        super(SubDisplay,self).__init__(**kwargs)
        #self.fc=FileChooserListView()
        self.fc=FileChooserIconView()
        self.fc.size_hint_y=7
        self.fc.filters=[SUFFIX[1]]

        self.dc=DirectoryChooser()
        self.dc.size_hint_y=6
        self.dc.filters=[self.dc.is_dir]
        
        self.btQuit=BtnQuit(text='QUIT',size_hint_y=1)
        
        self.txFile =TextInput(text="defaultName",size_hint_y=1,multiline=False)
        self.txEdit =TextInput(text="",size_hint_y=4,multiline=True)
        
    # テキストを表示する基本画面
    def DrawBase(self):
        self.clear_widgets()
        self.orientation='vertical'
               
        b1 =BtnTransferLoadFile(text='LoadFile',size_hint_y=1)
        b2 =BtnTransferSaveFile(text='SaveFile',size_hint_y=1)
        self.add_widget(self.txEdit)
        self.add_widget(b1)
        self.add_widget(b2)

    # ファイルロード画面
    def DrawLoadFile(self):
        self.clear_widgets()
        self.orientation='vertical'

        b1=BtnLoadFile(text='LoadFile',size_hint_y=1)
        
        self.fc.path=os.path.dirname(self.parent.lFile.text)
        self.add_widget(self.fc)
        self.add_widget(b1)
        self.add_widget(self.btQuit)

    # ファイルセーブ画面
    def DrawSaveFile(self):
        self.clear_widgets()
        self.orientation='vertical'
        
        base = os.path.split(self.parent.lFile.text)
        
        self.txFile.text = os.path.splitext(base[1])[0]
        self.dc.path=base[0]

        b1=BtnSaveFile(text='SaveFile',size_hint_y=1)
        
        self.add_widget(self.txFile)
        self.add_widget(self.dc)
        self.add_widget(b1)
        self.add_widget(self.btQuit)

# メインフレーム画面初期化にしか使われない
class Display(BoxLayout):
    orientation='vertical'
    def __init__(self,**kwargs):
        super(Display,self).__init__(**kwargs)
        self.lFile = Label(text=pathDef,size_hint_y=1)
        self.boxSub = SubDisplay(size_hint_y=8)
        self.add_widget(self.lFile)
        self.add_widget(self.boxSub)
        self.boxSub.DrawBase()
        
class TextEditorApp(App):
    def build(self):
        layout = Display()
        return layout

if __name__=='__main__':
    TextEditorApp().run()


ソースここまで

余り解説する事はありませんが
何年か前に載せたテキスト読み込みプログラムを改造して作りました。
又、kivy の日本語化ライブラリ japanize_kivy も使っています。世の中便利になっているんですね、作者の方に感謝です。
一応 Linux 上で動作確認しているのですが、環境に合わせてデフォルトのディレクトリパスを書き替えてください。

pathDef = ("/home/")

の内容を変えればOKのハズです。

で、なんでこんなモン作ったのか?ですが、ここ最近しょっちゅうアキバに買い物に行ってまして、行くたびに買い物メモを紙に書いて持って行ってたのです。
いや、スマホで良くね?と思ったのですが、私のスマホ、メモ帳入って無かったのですよ。

で、メモ帳アプリを物色していたら「無料版では広告が…」いや、メモ読むのに広告表示されるってなんやねん、となりまして。
それなら自分で作るかと思って作った…のですが、kivy でアプリ作るのも何年かぶりで10日以上かかりました。そして、作ってから気づいたのですよね、いつぞやのアップデートからアンドロイドって野良アプリから内部ファイルの読み書きできなくなっていなかったっけ?と。
仮に buildozer でコンパイルできたとしても、これアンドロイドでは使えないのかもしれませんね。

0 件のコメント:

コメントを投稿