Python INIファイル

Python GUIアプリでは、よく設定ファイルが必要になると思います。Windowsアプリでは、.iniファイルを設定ファイルにすることが多いと思います。
そこで、Python GUIアプリでもアプリ設定を.iniファイルで実現しようと思います。

このアプリ設定(.iniファイル)は、読み込みアクション(必須)と更新アクション(任意)を用意して再利用可能なようにクラス化して実装しました。このクラスは、アプリで使用するGUIパッケージ(モジュール)との関連を持たないので、設定項目のGUIが必要なら別途実装する必要があります。
当サイト内では、PySide6PyQt6TkinterのGUIサンプルアプリにて利用してます。

---config_ini.py---
# coding: utf-8
import configparser
import os

CONFIG_INI_FILE = "config.ini"
DEFAULT_SECTION = "DEFAULT"
SETTING_SECTION = "SETTING"
SAVE_FOLDER = "save_folder"
LATEST_SECTION = "LATEST"
RELEASE_VER = "version"
RELEASE_DATE = "date"
RELEASE_OVERVIEW = "overview"

class ConfigIni():
    def __init__(self):
        # .iniファイルが存在しない場合、キーの設定値に文字列をセットしてプログラム実行を続行する
        # 尚、キーの設定値にNoneをセットして(プログラム)処理にてExcetsion発生させ中断することも可能
        self.default_folder = ""
        self.save_folder = ""
        self.latest_ver = ""
        self.latest_date = ""
        self.latest_overview = ""
        try:
            self.config_ini = configparser.ConfigParser()
            if not os.path.exists(CONFIG_INI_FILE):
                raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), CONFIG_INI_FILE)
        except Exception as err:
            print(err)

    def read_config_ini(self):
        retval = False
        try:
            #self.config_ini.read(CONFIG_INI_FILE, encoding='utf-8')
            # Python 3.2以降のencoding指定(推奨)ぽい…AIによると
            with open(CONFIG_INI_FILE, 'r', encoding='utf-8') as fp:
                self.config_ini.read_file(fp)
            section = self.config_ini[DEFAULT_SECTION]
            self.default_folder = section.get(SAVE_FOLDER)
            section = self.config_ini[SETTING_SECTION]
            self.save_folder = section.get(SAVE_FOLDER)
            section = self.config_ini[LATEST_SECTION]
            self.latest_ver = section.get(RELEASE_VER)
            self.latest_date = section.get(RELEASE_DATE)
            self.latest_overview = section.get(RELEASE_OVERVIEW)
            retval = True
        except Exception as err:
            print(err)
        return retval

    def uptate_config_ini(self):
        retval = False
        try:
            self.config_ini.set(DEFAULT_SECTION, SAVE_FOLDER, self.default_folder)
            self.config_ini.set(SETTING_SECTION, SAVE_FOLDER, self.save_folder)
            # Python 3.2以降のencoding指定(推奨)方法
            with open(CONFIG_INI_FILE, 'w', encoding='utf-8') as fp:
                self.config_ini.write(fp)
            retval = True
        except Exception as err:
            print(err)
        return retval
---config.ini---
[DEFAULT]
save_folder = C:/

[SETTING]
save_folder = C:/Python

[LATEST]
version = V1.0.0
date = 25/10/20
overview = ここにリリース概要を記載する

設定ファイルの読み込みは GUIアプリのGUI表示前(前段)に行い、更新(書き込み)はGUIメインループ後(最終段)に行います。

PySide6やPyQt6のmain.pyでは こんな感じ。またはGUI表示開始の__init__()内先頭にて実装します。サイト内GUIサンプルアプリは後者の実装です。

---main.py---
import config_ini

if __name__ == "__main__":
    app = QApplication(sys.argv)
    config_ini = config_ini.ConfigIni()
    config_ini.read_config_ini()        #設定ファイル読み込み
    #GUI表示(割愛):GUI表示クラス生成時の引数(パラメータ)にconfig_iniを渡してもよい
    retval = app.exec()    #GUIメインループ
    config_ini.uptate_config_ini()      #設定ファイル更新
    sys.exit(retval)

Tkinterのmain.pyではこんな感じ。またはGUI表示開始の__init__()内先頭にて実装します。サイト内GUIサンプルは後者の実装です。

---main.py---
import config_ini

if __name__ == "__main__":
    root = tk.Tk()
    config_ini = config_ini.ConfigIni()
    config_ini.read_config_ini()        #設定ファイル読み込み
    #GUI表示(割愛):GUI表示クラス生成時の引数(パラメータ)にconfig_iniを渡してもよい
    root.mainloop()    #GUIメインループ
    config_ini.uptate_config_ini()      #設定ファイル更新

 

コメントを残す