wxPythonで簡単なファイルマネージャーを作成する

2021年6月20日日曜日

Python wxPython ファイル

t f B! P L

フリー素材からダウンロードせずに、自分でイメージ図を作るのに挑戦していますが、めちゃ下手です。

今回やること

今回は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

コメント気軽にどうぞ!

このブログを検索

要望について

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

最近の出来事

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

アンケート

Welcome!

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

お問い合わせ

名前

メール *

メッセージ *

QooQ