【Python GUI tkinterサンプル】ttk.Comboboxの選択肢をconfigparserを使ってファイルから読み込む

<tkinterトップページに戻る>

 

主に使用するライブラリ

  • configparser
  • json

configparserはiniファイル構造のテキストファイルを読み込んで辞書形式として値を取得することができます。

configparserはリスト型を正しく認識することができない(一連の文字列として取得してしまう)ため、

jsonライブラリを使うことによって取得した文字列をリストに変換します。

 

設定値を外部ファイルから読み取る

設定値をソースコードと設定ファイルに切り離すことによって、

設定値を利用者毎に設定出来たり、状況に応じて読み取るファイルを切り替えたりできます。

例えばメッセージの文章を選択された言語(英語、日本語)で切り替える場合など。

また設定値が変更される度にソフトウェアのソースコードを修正する必要がなくなり、

コンパイルする必要が減るため(Pythonのようなインタプリタ型言語では基本的に不要)、

ソフトウェアの保守性を高める利点があります。

今回はINIファイルを利用するが、propertiesやXMLなども設定ファイルとして活用できます。

 

公式リファレンス

https://docs.python.org/ja/3/library/configparser.html

INIファイル

(Wikipadia)INIファイル

サンプル画像

サンプルコードの実行

ConfigValues

サンプル構造

.
├── ComboboxSample_config.py
└── config
     └── config.ini

下記からiniファイル、サンプルコードを取得しディレクトリ構造は上記のようにして実行してください

 

iniファイルサンプル

[settings]
label=果物
fruitvalues=["ぶどう","バナナ","もも","いちご"]

サンプルコード

from tkinter import *
import tkinter.ttk as ttk
import configparser
import json
import os

class ConfigValuesSample(ttk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.label_values="label"
        self.fruit_values=""
        self.load_config()
        self.create_widgets()
        self.pack()

    """
    config.iniから読み取った値を各Widgetのオプションに与える
    """
    def create_widgets(self):
        label = ttk.Label(text=self.label_values)
        label.pack()
        combo = ttk.Combobox(self,values=self.fruit_values)
        combo.pack()

    """
    このファイルのパスからconfig.iniファイルのパスを取得し、UTF-8で読み込む
    json.loadsを使用すること(loadではない)
    """
    def load_config(self):
        path =os.path.join(os.path.dirname(__file__),"config/config.ini")
        config = configparser.ConfigParser()
        config.read(path,"UTF-8")
        self.label_values = config["settings"]["label"]
        self.fruit_values=json.loads(config["settings"]["fruitvalues"])

if __name__ == '__main__':
    master = Tk()
    master.title("ConfigValuesSample")
    master.geometry("300x200")
    ConfigValuesSample(master)
    master.mainloop()

あわせて読みたい