フリー素材からダウンロードせずに、自分でイメージ図を作るのに挑戦していますが、めちゃ下手です。
今回やること
今回はwxPythonで簡単なファイルマネージャーを作成したいと思います。Windowsのエクスプローラーみたいなやつです。
本当にシンプルなので、ファイルの表示と実行のみ実装させたいと思います。
使うライブラリ
・os・wxPython
・sys
・subprocess
・os.path
osはファイル一覧を取得するために使います。globライブラリもあるようですが、
速度が微妙に遅い気がするので使いません。
また、os.pathはそのファイルがフォルダかどうか確かめる必要があるので使います。
wxPythonは今回のメインなので絶対に使います。
sysはアプリを完全に終了させるために必要です。wxPythonのDestoryでもいいんですが、完全に終了できていないため、sysのexitを利用します。
ソースコード
import wx
import sys
import os
import os.path
import subprocess
class Main(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,-1,"ファイルマネージャー")
self.listctrl = wx.ListCtrl(self,-1,style=wx.LC_REPORT)
self.listctrl.Bind(wx.EVT_LIST_ITEM_SELECTED,self.itemSelect)
self.listctrl.InsertColumn(0,"ファイル名",wx.LIST_FORMAT_LEFT,300)
self.root = "C:\\Users"
self.load(self.root)
MBar = wx.MenuBar()
FMenu = wx.Menu()
FMenu.Append(0,"上のフォルダへ")
MBar.Append(FMenu,"マネージャー")
self.SetMenuBar(MBar)
self.Bind(wx.EVT_MENU,self.menuSelect)
def menuSelect(self,event):
ID = event.GetId()
if ID == 0:
tmp = os.path.dirname(self.root)
self.root = tmp
self.load(self.root)
def load(self,dirname):
self.listctrl.DeleteAllItems()
filelist = os.listdir(dirname)
i = 0
for file in filelist:
self.listctrl.InsertItem(i,file,i)
i += 1
def itemSelect(self,event):
index = self.listctrl.GetFirstSelected()
text = self.listctrl.GetItemText(index,0)
path = self.root + "\\" + text
if os.path.isfile(path):
subprocess.Popen("\""+ path + "\"", shell=True)
else:
self.root = path
self.load(self.root)
app = wx.App(0)
Main().Show(True)
app.MainLoop()
解説
それではコードを詳しくみていきます。最初のimport文は解説不要でしょう。
self.listctrl = wx.ListCtrl(self,-1,style=wx.LC_REPORT)
self.listctrl.Bind(wx.EVT_LIST_ITEM_SELECTED,self.itemSelect)
self.listctrl.InsertColumn(0,"ファイル名",wx.LIST_FORMAT_LEFT,300)
この部分は、1行目にListCtrlを作成していて、2行目にリストアイテムが選択されたときの動作を指定しています。また、列「ファイル名」を作成するために、3行目にInsertColumnを実行しています。
self.root = "C:\\Users"
self.load(self.root)
1行目のself.rootはファイルマネージャーに表示されてるファイル達のいるディレクトリです。そして、2行目のself.loadではListCtrlに反映するために、呼び出しています。
MBar = wx.MenuBar()
FMenu = wx.Menu()
FMenu.Append(0,"上のフォルダへ")
MBar.Append(FMenu,"マネージャー")
self.SetMenuBar(MBar)
self.Bind(wx.EVT_MENU,self.menuSelect)
ここらへんはメニューバーに関してです。ここの解説は不要でしょう。
def menuSelect(self,event):
ID = event.GetId()
if ID == 0:
tmp = os.path.dirname(self.root)
self.root = tmp
self.load(self.root)
ここはメニューがクリックされたときの動作を入れる部分ですが、4行目に注目!!dirnameというのは、パスの親フォルダ名を取得するためのやつです。例えばC:\Users\username\Desktopでdirnameを使用すると、C:\Users\usernameが返ってきます。
それを、self.rootに入れて、self.loadで反映しています。
def load(self,dirname):
self.listctrl.DeleteAllItems()
filelist = os.listdir(dirname)
i = 0
for file in filelist:
self.listctrl.InsertItem(i,file,i)
i += 1
これはListCtrlに反映するためのコード達です。最初に、DeleteAllItemsでいったん、アイテムを全て削除します。
3行目では、このディレクトリのファイル/フォルダ一覧を取得しています。それをつかって、4行目5行目6行目7行目でセットしている感じです。
def itemSelect(self,event):
index = self.listctrl.GetFirstSelected()
text = self.listctrl.GetItemText(index,0)
path = self.root + "\\" + text
if os.path.isfile(path):
subprocess.Popen("\""+ path + "\"", shell=True)
else:
self.root = path
self.load(self.root)
ここでは、アイテムが選択されたときに、選択されたファイルを実行 / フォルダの中身を反映するためのものです。2行目で、選択されているインデックスを取得、3行目で選択されているファイル名を取得、4行目で選択されているファイルのパス全体を取得しています。
そして6行目は選択されたアイテムがフォルダ」ではなくファイルだった場合に実行されます。subprocessを使ってファイルを既定のアプリで開くようにしています。
9行目10行目は選択されたアイテムがフォルダだったときに実行されます。そのフォルダの中身を取得して、ファイルマネージャーに反映しています。
10分ぐらいで作成した記事です。めちゃくちゃシンプルなので、カスタマイズが必要です。
動作環境:
Python 3.9.1
wxPython 4.1.1a1
Windows 10
64bit
コメント気軽にどうぞ!

当ブログをご覧いただきありがとうございます。
返信削除こちらの記事もおすすめです。↓↓↓
https://programming-self-study.blogspot.com/2021/06/wxpythonnotepad.html
メモ帳を作ってみました。
ぜひご覧ください!