Python GUIアプリでは、よく設定ファイルが必要になると思います。Windowsアプリでは、.iniファイルを設定ファイルにすることが多いと思います。
そこで、Python GUIアプリでもアプリ設定を.iniファイルで実現しようと思います。
このアプリ設定(.iniファイル)は、読み込みアクション(必須)と更新アクション(任意)を用意して再利用可能なようにクラス化して実装しました。このクラスは、アプリで使用するGUIパッケージ(モジュール)との関連を持たないので、設定項目のGUIが必要なら別途実装する必要があります。
当サイト内では、PySide6、PyQt6、Tkinterの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() #設定ファイル更新