【Python GUI tkinterサンプル】TextWidgetを使用してドキュメント作成支援ツールをつくる

ブログなどで何か決まったものを発信する際、フォーマットに従って文章を書いていくと思います。

テンプレートファイルをコピーして書いていく方法も良いですが、

もっとスマートに書くために今回はドキュメント作成支援ツール(サンプル)を作成します。

※サンプルではツールの成果物はコンソールに出力されますので、必要に応じて適宜修正してください。

ツールの使い方

①設定ファイル(.ini)を用意する

項目をサンプル設定ファイルを参考に記述してください。

②設定ファイルを読み込む

Loadボタンを押下し設定ファイルを読み込んでください

③出力する

サンプルプログラムではコンソールに出力されます。

必要によってファイルに書き出す処理を加えてください。

主に使用するWidget

・Text

TextWidgetの使い方

#作成
text = Text(self)

#入力値をすべて取得する
text.get("1.0","end-1c")

Textは現在ttkにありません。

またTextには制御変数を登録することができないため、

値を取得するためにはText自身を何らかの方法で保持する必要があります。

サンプル画像

サンプル設定ファイルを読み込んだときのキャプチャ

DocBuilder

サンプルコード

from tkinter import *
import tkinter.ttk as ttk
import os
import configparser
import tkinter.filedialog as filedialog
"""
ドキュメント作成Logic
"""
class DocBuilderLogic:
    """
    sectionsに登録されている項目を取得し返す
    """
    def loadConfig(self,config_file):
        print(config_file)
        path =os.path.join(os.path.dirname(__file__),config_file)
        config = configparser.ConfigParser()
        config.read(path,"UTF-8")
        sections = config["sections"]
        return sections
    """
    出力する
    """
    def output(self,output_map):
        for elem in output_map.keys():
            print(elem)
            print(output_map[elem])

"""
ドキュメント作成Control
"""

class DocBuilderControl:

    def __init__(self):
        master = Tk()
        master.title("DocBuilder")
        master.geometry("300x430")
        self.logic = DocBuilderLogic()
        self.view = DocBuilderView(master)
        self.view.setFileLoadCommand(self.loadConfig)
        master.mainloop()

    """
    .iniファイルから出力フォーマットを取得し入力Widget構築を構築する
    """
    def loadConfig(self):
        self.view.deleteInputFrame()
        sections = self.logic.loadConfig(self.view.getFileName())
        for key in sections.keys():
            self.view.createTextpanel(key)
        self.view.createOutputButton(self.outputCommand)
    """
    入力Widgetからラベルとテキストボックスの内容をマッピングし、
    出力する
    """
    def outputCommand(self):
        map = self.view.map
        map_ ={}
        for elem in map.keys():
            map_[elem] = map[elem].get("1.0","end-1c")
        self.logic.output(map_)

"""
ドキュメント作成View
"""
class DocBuilderView(ttk.Frame):

    def __init__(self, master):
        super().__init__(master)
        self.map={}
        self.create_widgets()
        self.pack()


    def create_widgets(self):
        self.createInputFileWidget()
        self.input_frame= ttk.Frame()
        self.input_frame.pack(side="bottom")

    def createOutputButton(self,command=""):
        btn = ttk.Button(self.input_frame,text="out",command=command)
        btn.pack()
    """
    設定ファイル読み込みWidget
    """
    def createInputFileWidget(self):
        frame = ttk.Frame(self)
        frame.pack()
        self.file_name=StringVar()
        self.entry = ttk.Entry(frame,textvariable=self.file_name)
        self.entry.grid(column=0,row=0)
        file_chooser = ttk.Button(frame,text="File",command=self.openFileDialog)
        file_chooser.grid(column=1,row=0)
        self.file_load = ttk.Button(frame,text="load")
        self.file_load.grid(column=2,row=0)
    """
    入力Widget群を削除
    """
    def deleteInputFrame(self):
        children = self.input_frame.winfo_children()
        for child in children:
            child.destroy()

    def setFileLoadCommand(self,command):
        self.file_load["command"] = command

    def getFileName(self):
        return self.file_name.get()

    def openFileDialog(self):
        self.file_name.set(filedialog.askopenfilename(filetypes=[("config file", "*.ini")]))
    """
    ラベルと入力テキストボックスをまとめたWidgetの作成
    """
    def createTextpanel(self,title="title",variable=None,width=40):
        frame = ttk.Frame(self.input_frame)
        frame.pack()
        label = ttk.Label(self.input_frame,text=title)
        label.pack()
        text = Text(self.input_frame,width=width,height=5)
        text.pack()
        self.map[title] = text


if __name__ == '__main__':
    DocBuilderControl()

サンプル設定ファイル

値は今回は必要ないので”=”のみ

[sections]
使用するモジュール=
使い方=
サンプル画像=
サンプルコード=

 

あわせて読みたい