今回の内容
皆さん、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はウィジェットが豊富で自由度が高いので、応用するといろいろなツールが作成できます。
0 件のコメント:
コメントを投稿