【Python GUI tkinterサンプル】TextWidgetを使用してドキュメント作成支援ツールをつくる
ブログなどで何か決まったものを発信する際、フォーマットに従って文章を書いていくと思います。
テンプレートファイルをコピーして書いていく方法も良いですが、
もっとスマートに書くために今回はドキュメント作成支援ツール(サンプル)を作成します。
※サンプルではツールの成果物はコンソールに出力されますので、必要に応じて適宜修正してください。
ツールの使い方
①設定ファイル(.ini)を用意する
項目をサンプル設定ファイルを参考に記述してください。
②設定ファイルを読み込む
Loadボタンを押下し設定ファイルを読み込んでください
③出力する
サンプルプログラムではコンソールに出力されます。
必要によってファイルに書き出す処理を加えてください。
主に使用するWidget
・Text
TextWidgetの使い方
#作成 text = Text(self) #入力値をすべて取得する text.get("1.0","end-1c")
Textは現在ttkにありません。
またTextには制御変数を登録することができないため、
値を取得するためにはText自身を何らかの方法で保持する必要があります。
サンプル画像
サンプル設定ファイルを読み込んだときのキャプチャ
サンプルコード
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] 使用するモジュール= 使い方= サンプル画像= サンプルコード=