Python 簡単なGUIツールの作り方 PyQt6編 ファイル名置換ツール

プログラミング

概要

GUIを使ったツールを作る例を紹介します。

今回は、PyQt6でファイル名の置換ツールを作ってみます。
この記事を読めばGUIを使ったツールの作る方の流れが理解できることと思います。

テストした環境は、Windows10です。
なお、作ったものは実際にファイル名の置換が出来ますが例として作ったものなので細かな配慮に欠けていることはご承知ください。
テスト用のフォルダで実行してください。

PyQt6のインストール方法は、

pip install pyqt6

です。

ファイル名置換ツール

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# -*- coding:utf-8 -*-

from pathlib import Path
import re
from PyQt6.QtWidgets import (
    QApplication, QMainWindow, QVBoxLayout, QPushButton,
    QLineEdit, QLabel, QFileDialog, QWidget
)

class FileRenamerApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("ファイル名置換ツール")
        
        # Main widget
        self.main_widget = QWidget()
        self.setCentralWidget(self.main_widget)
        
        # Layout
        self.layout = QVBoxLayout(self.main_widget)
        
        # Folder selection
        self.folder_label = QLabel("フォルダ: 未選択")
        self.layout.addWidget(self.folder_label)
        self.select_folder_button = QPushButton("フォルダを選択")
        self.select_folder_button.clicked.connect(self.select_folder)
        self.layout.addWidget(self.select_folder_button)
        
        # Pattern input
        self.pattern_input = QLineEdit()
        self.pattern_input.setPlaceholderText("置換パターン (例: test)")
        self.layout.addWidget(self.pattern_input)
        
        # Replace input
        self.replace_input = QLineEdit()
        self.replace_input.setPlaceholderText("置換後の文字列 (例: newfilename_)")
        self.layout.addWidget(self.replace_input)
        
        # Execute button
        self.execute_button = QPushButton("実行")
        self.execute_button.clicked.connect(self.rename_files)
        self.layout.addWidget(self.execute_button)
        
        # Status label
        self.status_label = QLabel("")
        self.layout.addWidget(self.status_label)
        
        # State variables
        self.selected_folder = None
    
    def select_folder(self):
        folder = QFileDialog.getExistingDirectory(self, "フォルダを選択")
        if folder:
            self.selected_folder = Path(folder)
            self.folder_label.setText(f"フォルダ: {self.selected_folder}")
    
    def rename_files(self):
        if not self.selected_folder:
            self.status_label.setText("フォルダを選択してください。")
            return
        
        pattern = self.pattern_input.text()
        replace = self.replace_input.text()
        
        if not pattern or not replace:
            self.status_label.setText("パターンと置換文字列を入力してください。")
            return
        
        try:
            for filename in self.selected_folder.iterdir():
                if filename.is_file():
                    new_filename = re.sub(pattern, replace, filename.name)
                    filename.rename(self.selected_folder / new_filename)
            self.status_label.setText("ファイル名を置換しました。")
        except Exception as e:
            self.status_label.setText(f"エラー: {str(e)}")

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    window = FileRenamerApp()
    window.show()
    sys.exit(app.exec())

コードを実行すると以下のような画面が表示されます。

使い方

“フォルダ選択”ボタンを押して変換するファイルのあるフォルダを選択します。
“置換パターン”に正規表現で置換するパターンを入力します。
“置換後の文字列”にパターンと入れ替える文字列を入力します。
“実行”ボタンを押して実行します。
変換が完了すると”実行”ボタンの下のラベルに終了したことを知らせます。

部品

主な部品は、以下の表中の7つの部品になります。これらの組み合わせでツールの表示部分は作られています。
そして、機能部分は “rename_files()”に纏められています。

“画面上の文字列” “コード中の変数名”
メインのウィジット self.main_widget
レイアウト self.layout
「フォルダ:未選択」 self.folder_label
パターン文字列 pattern_input
置換文字列 replace_input
「実行ボタン」 execute_button
なし status_label

コード解説

QMainWindow

10行目で

class FileRenamerApp(QMainWindow):

メインのクラスで”QMainWindow”クラスを継承しています。
“QMainWindow”は、使わないで”QWidget”を継承してもいいのですが基本アプリケーションを作る場合は”QmainWindow”を使うのが良いです。
“メニューバー”や”ステータスバー”などがあらかじめ作られて用意されているからです。

QMainWindowの構造
  • メニューバー
  • ツールバー
  • セントラルウィジット
  • ステータスバー

今回は使われていませんが、このような構造が用意されています。
設定すれば、すぐに使えるわけです。

__init()__

この中のコンストラクタ “__init__()”の中で部品が組み立てられています。
16行目 : セントラルウィジットに”QWidget”(= main_widget)を設定しています。
20行目 : QWidget(= main_widget)にQVBoxLayoutを設定しています。これで部品が縦並びに配置されます。
23~27行目 : ラベルと”ファイルの選択”ボタンを配置しています。
26行目 : “ファイルの選択”ボタンを押したときに “select_folder”メソッドが実行されるように設定しています。
30~32行目 : 置換される文字列(パターン)を入力する”QLineEdit”を設定しています。
35~37行目 : パターンと置換する文字列を入力する”QLineEdit”を設定しています。
40~42行目 : “実行”ボタンを設定しています。
41行目 : “実行”ボタンを押したときに実行されるメソッドを設定しています。
45~46行目 : 実行後のステータスを表示するラベルを設定しています。
49行目 : 対象のフォルダを設定するインスタンス変数を初期化しています。

select_folder()

51~55行目 :  “フォルダを選択”ボタンを押したときの動作を定義しています。
52行目 : フォルダを選択するダイアログを表示します。
53~55行目 : ダイアログが返したフォルダのパスを”selected_folder”に設定して、ラベルに表示します。

rename_files()

57~76行目 : ここでファイル名の置換を行っています。

メインブロック

78~83行目 : ここで実際に作成したウィンドウを表示させています。

まとめ

これで、PyQt6の簡単な使い方の流れが分かったかなと思います。
部品やその使い方は、いろいろありますので少しづつ覚えていけいろんなことが出来るようになるかと思います。

フォルダを選択するだけではなく、特定の拡張子のファイルだけ変換したり。
フォルダ内を再帰的に変換したり、使いやすいように変更できる点は色々あると思います。
使いや易いように改造したり、文字列置換ではなくてもファイルコピーとかファイル圧縮とか使い道は何かとありそうなので、ご自身で何か作るときにお役立てください。

 

 

Commnts