700ビュー!wxPythonで普通に使えるメモ帳ソフトを作ってみた。

2021年8月2日月曜日

Python wxPython ソフト配布

t f B! P L

今回の内容

皆さん、700ビューありがとうございます!
って喜ぶ数字ではないと思いますが。
さて今回は700ビュー祝いということで、ソフトを作ってみました。
exe ファイルとしても配布しますし、コードファイルとしても配布します。

ソースコード

import wx
import wx.adv
import sys
import chardet
import subprocess
class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self,None,–1,"普通のメモ帳",size=(800,500))
        panel = wx.Panel(self,–1)
        self.textctrl = wx.TextCtrl(panel,–1,"",style=wx.TE_MULTILINE)
        self.textctrl.Bind(wx.EVT_KEY_DOWN, self.ChangeText)
        self.textctrl.Bind(wx.EVT_LEFT_DOWN, self.ChangeText)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.textctrl,1,wx.EXPAND)
        panel.SetSizer(sizer)

        self.CreateMenuBar()
        self.EncodeMenu.Check(50,True)

        self.CreateStatusBar(3)
        self.SetStatusText("UTF–8",1)

        #self.encodeの文字列はそのまま使う用で、少し違うので注意!
        self.encode="UTF_8"

        if len(sys.argv)==2:
            text = self.ReadFile(sys.argv[1])
            self.textctrl.SetValue(text)
            self.filename = sys.argv[1]
            self.SetTitle("普通のメモ帳 – " + sys.argv[1])
        else:
            self.filename = ""

        pos = self.textctrl.PositionToXY(self.textctrl.GetInsertionPoint())
        self.SetStatusText("行:"+str(pos[2]+1)+"列:"+str(pos[1]),2)
        self.Bind(wx.EVT_MENU,self.SelectMenuBar)

    def CreateMenuBar(self):

        #メニューバーを作成します。

        Bar = wx.MenuBar()
        FileMenu = wx.Menu()
        ReOpenMenu = wx.Menu()
        ReOpenMenu.Append(40,"UTF–8")
        ReOpenMenu.Append(41,"UTF–8(BOM)")
        ReOpenMenu.Append(42,"UTF–16 LE")
        ReOpenMenu.Append(43,"UTF–16 BE")
        ReOpenMenu.Append(44,"Shift–JIS")
        self.EncodeMenu = wx.Menu()
        EncodeMenu = self.EncodeMenu
        EncodeMenu.AppendRadioItem(50,"UTF–8")
        EncodeMenu.AppendRadioItem(51,"UTF–8(BOM)")
        EncodeMenu.AppendRadioItem(52,"UTF–16 LE")
        EncodeMenu.AppendRadioItem(53,"UTF–16 BE")
        EncodeMenu.AppendRadioItem(54,"Shift–JIS")
        EncodeMenu.AppendRadioItem(55,"自動検出されたコード")
        FileMenu.Append(1,"新しいファイル (&N)")
        FileMenu.Append(2,"開く... (&O)")
        FileMenu.AppendSubMenu(ReOpenMenu,"エンコード指定再読み込み (&E)")
        FileMenu.AppendSeparator()
        FileMenu.Append(4,"上書き保存 (&S)")
        FileMenu.Append(5,"名前を付けて保存 (&A)")
        FileMenu.AppendSubMenu(EncodeMenu,"保存時のエンコード指定 (&C)")
        FileMenu.AppendSeparator()
        FileMenu.Append(7,"終了(&X)")
        Bar.Append(FileMenu,"ファイル (&F)")
        EditMenu = wx.Menu()
        EditMenu.Append(10,"元に戻す (&U)")
        EditMenu.AppendSeparator()
        EditMenu.Append(11,"切り取り (&X)")
        EditMenu.Append(12,"コピー (&C)")
        EditMenu.Append(13,"貼り付け (&P)")
        EditMenu.Append(14,"全て選択 (&A)")
        Bar.Append(EditMenu,"編集 (&E)")
        ToolMenu = wx.Menu() #現バージョンでは不可
        ToolMenu.Append(20,"カスタマイズ... (&C)")
        ToolMenu.AppendSeparator()
        ToolMenu.Append(21,"設定... (&S)")
        #Bar.Append(ToolMenu,"ツール (&T)")
        HelpMenu = wx.Menu()
        HelpMenu.Append(30,"普通のメモ帳について")
        Bar.Append(HelpMenu,"ヘルプ (&H)")

        self.SetMenuBar(Bar)

    def ChangeText(self,event):
        pos = self.textctrl.PositionToXY(self.textctrl.GetInsertionPoint())
        self.SetStatusText("行:"+str(pos[2]+1)+"列:"+str(pos[1]),2)
        event.Skip()

    def SelectMenuBar(self,event):
        ID = event.GetId()
        if ID == 1:
            subprocess.Popen(sys.argv[0],shell=True) #プログラムをさらに実行
        elif ID == 2:
            dialog = wx.FileDialog(self,"ファイルを開く",wildcard="テキスト形式 | *.txt | 全ての形式 | *.*",style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
            if dialog.ShowModal()==wx.ID_OK:
                path = dialog.GetPath()
                text = self.ReadFile(path)
                self.filename=path
                self.SetTitle("普通のメモ帳 – " + path)
                self.textctrl.SetValue(text)
                pos = self.textctrl.PositionToXY(self.textctrl.GetInsertionPoint())
                self.SetStatusText("行:"+str(pos[2]+1)+"列:"+str(pos[1]),2)
        elif ID == 4:
            if self.filename=="":
                self.SaveAs()
            else:
                openfile = open(self.filename,"w",encoding=self.encode)
                openfile.write(self.textctrl.GetValue())
                openfile.close()
        elif ID == 5:
            self.SaveAs()
        elif ID == 7:
            sys.exit()
        elif ID == 10:
            if self.textctrl.CanUndo():
                self.textctrl.Undo()
        elif ID == 11:
            if self.textctrl.CanCut():
                self.textctrl.Cut()
        elif ID == 12:
            if self.textctrl.CanCopy():
                self.textctrl.Copy()
        elif ID == 13:
            if self.textctrl.CanPaste():
                self.textctrl.Paste()
        elif ID == 14:
            self.textctrl.SelectAll()
        elif ID == 20:
            self.CustomizeDialog()
        elif ID == 21:
            self.SettingDialog()
        elif ID == 30:
                aboutInfo = wx.adv.AboutDialogInfo()
                aboutInfo.SetName("普通のメモ帳")
                aboutInfo.SetVersion("1.0")
                aboutInfo.SetDescription(("普通のメモ帳アプリ"))
                aboutInfo.SetCopyright("(C) 2021")
                aboutInfo.SetWebSite("https://programming-self-study.blogspot.com")
                aboutInfo.AddDeveloper("My Develop")
                wx.adv.AboutBox(aboutInfo)
        else:
            if ID < 49:
                if ID == 40:
                    self.encode = "UTF-8"
                elif ID == 41:
                    self.encode = "UTF-8-SIG"
                elif ID == 42:
                    self.encode = "UTF-16LE"
                elif ID == 43:
                    self.encode = "UTF-16BE"
                elif ID == 44:
                    self.encode = "Shift-JIS"
                self.EncodeMenu.Check(ID+10,True)
                if self.filename != "":
                    text = self.ReadFile(self.filename, self.encode)
                    self.textctrl.SetValue(text)
                self.SetStatusText(self.encode, 1)
            else:
                self.EncodeMenu.Check(ID,True)
                if ID == 50:
                    self.encode = "UTF-8"
                elif ID == 51:
                    self.encode = "UTF-8-SIG"
                elif ID == 52:
                    self.encode = "UTF-16LE"
                elif ID == 53:
                    self.encode = "UTF-16BE"
                elif ID == 54:
                    self.encode = "Shift-JIS"
                self.SetStatusText(self.encode, 1)


    def SaveAs(self):
        dialog = wx.FileDialog(self,"名前を付けて保存",wildcard="テキスト形式 | *.txt; | 全ての形式 | *.*",style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
        if dialog.ShowModal()==wx.ID_OK:
            path = dialog.GetPath()
            self.filename=path
            openfile = open(self.filename,"w",encoding=self.encode)
            openfile.write(self.textctrl.GetValue())
            openfile.close()
            self.SetTitle("普通のメモ帳 – " + path)
    def ReadFile(self,path,encoding=None):

        #ファイル内容をエンコード検出して読み取ります。
        #ShiftJISとUTF–8を間違える場合があります。

        if encoding==None:
            tmp = open(path,"rb")
            encode = chardet.detect(tmp.read())["encoding"]
            tmp.close()
            file = open(path,"r",encoding=encode,errors="ignore")
            text = file.read()
            file.close()
            self.SetStatusText(encode,1)
            self.EncodeMenu.Check(55,True)
            return text
        else:
            file = open(path,"r",encoding=encoding,errors="ignore")
            text = file.read()
            file.close()
            return text

app = wx.App(0)
MyFrame().Show(True)
app.MainLoop()

exeファイルの配布

Inno Setup でセットアップのファイルです。
インストールしてお使いください。

notepad_setup.exe
-----ダウンロード方法----- (Microsoft Edge)

1.上び「notepad_setup.exe」をクリックし、ダウンロードします。
2.
のように、「ダウンロード」をクリックします。
3.
のように、警告がでても「保存」をクリックします。
4.
大丈夫です。「保持」をクリックしてください。
5.セットアップを開始します。
pyinstallerとinnosetupクソです。ウイルス検出されてり、こんな感じで警告でるので。

もちろん、↑のコード以外には何のコードも付け足しておりませんので、安全です。
エラーの報告、お願いします。

確認済みの不具合

・「テキスト形式」にしても*.txtファイルが発見されない
[コードでは問題なくexeファイルでのみ発生中] ・コンソールが表示されてしまう() 黒い画面

wxPythonの今スグ使えるサンプル集18個!GUI開発をマスターしよう!

今回はwxPythonのサンプルを18個紹介したいと思います。
wxPythonはウィジェットが豊富で自由度が高いので、応用するといろいろなツールが作成できます。

このブログを検索

要望について

ブログのレイアウトやテーマについての提案をいただきました。現在qooqテーマを適応中です。 語尾を自動でつけるプログラムを作りたいという要望をいただきました。是非紹介したいですがどの言語でどのようなプログラムかなど、お問い合わせフォームで詳しく教えてください!

最近の出来事

最近の出来事
寿司打お勧め75位♪(練習モードだけど)

アンケート

Welcome!

「プログラミング独学ブログ」へようこそ。 Yakinyといいます。幅広い範囲で投稿していますので、ぜひ過去の記事も見てみてください!!コメントも大歓迎です!更新がとまってしまって申し訳ございません

お問い合わせ

名前

メール *

メッセージ *

QooQ