Python tkinterによるGUIの作成

 本記事では、下図のようなGUIアプリをPythonの標準ライブラリ「tkinter」で作成する雛形コードを載せました。

下図のようにファイルを選択したり、選択したファイルパスや、その内容を表示したりします。

■本プログラム

import os
import tkinter as tk
import tkinter.filedialog as fd
import pandas as pd
from pycaret.regression import *
import datetime
now = datetime.datetime.now()
now = now.strftime("%y%m%d")

class App(tk.Frame):
    def __init__(self, master = None):
        tk.Frame.__init__(self, master)
        self.pack()
        self.create_widgets()
        #root.title("回帰分析GUIアプリ") # アプリの名前
        #root.geometry("500×500") # アプリの画面サイズ
        
    def create_widgets(self):
        # ラベル
        self.lbl1 = tk.Label(self, text = '回帰モデル')
        self.lbl1.grid(row = 0, column = 0)
        self.lbl2 = tk.Label(self, text = '解析したいデータ')
        self.lbl2.grid(row = 1, column = 0)
        
        # ファイル選択ボタン
        self.btn1 = tk.Button(self, text = 'ファイル選択', command = self.btn_open_file1)
        self.btn1.grid(row = 0, column = 2)
        self.btn2 = tk.Button(self, text = 'ファイル選択', command = self.btn_open_file2)
        self.btn2.grid(row = 1, column = 2)
        
        # エントリー(パスの表示する場所)
        self.ent1 = tk.Entry(self, width = 70)
        self.ent1.grid(row = 0, column = 1)
        self.ent2 = tk.Entry(self, width = 70)
        self.ent2.grid(row = 1, column = 1)
        
        # テキストエリア(読み込んだデータを表示する場所)
        self.text1 = tk.Text(self)
        self.text1.grid(row = 3, column = 0, columnspan = 8)
        self.text2 = tk.Text(self)
        self.text2.grid(row = 6, column = 0, columnspan = 8)
        
        # 実行ボタン
        self.btnf = tk.Button(self, text = '実行', command = self.analysis)
        self.btnf.grid(row = 10, column = 2)
        
    # フォルダ検索メソッド
    def btn_open_folder(self):
        self.ent1.delete(0, tk.END)
        self.ent1.insert(0, fd.askdirectory())
        
    # ファイル選択メソッド
    def btn_open_file1(self):
        self.ent1.delete(0, tk.END)
        filetype1 = [('オブジェクトファイル', '*.pkl'), ('すべて', '*')]
        file_path1 = fd.askopenfilename(initialdir = os.path.expanduser('~/Desktop'), filetypes = filetype1)
        # エントリーエリアに表示
        self.ent1.insert(0, file_path1)
        
        self.load_reg_model = load_model(file_path1[:-4])
        # テキストエリアに表示
        self.text1.insert('end', self.load_reg_model)

    def btn_open_file2(self):
        self.ent2.delete(0, tk.END)
        filetype2 = [('カンマ', '*.csv'), ('エクセル', '*.xlsx'), ('すべて', '*')]
        file_path2 = fd.askopenfilename(initialdir = os.path.expanduser('~/Desktop'), filetypes = filetype2)      
        # エントリーエリアに表示
        self.ent2.insert(0, file_path2)        

        self.df = pd.read_csv(file_path2)
        # テキストエリアに表示
        self.text2.insert('end', self.df)
    
#     # 検索ボタンメソッド
#     def search(self):
#         if self.ent1.get() == '' or self.ent2.get() == '':
#             self.text.insert('1.0', 'フォルダと拡張子と検索語を入力してください')
#             return
        
#         self.text.delete('1.0', 'end')
#         kts = self.ent2.get()
#         for dirpath, dirnames, filenames in os.walk(self.ent1.get()):
#             for name in filenames:
#                 if kts in name:
#                     target = self.ent3.get()
#                     filename = os.path.join(dirpath, name)
#                     self.text.insert('end', '-----' + filename + '-----\n')
#                     f = open(filename, errors = 'ignore')
#                     for num, line in enumerate(f):
#                         if target in line:
#                             insert_line = str(num) + ':' + line
#                             self.text.insert('end', insert_line)
#                     f.close()
                    
    # 実行ボタンメソッド
    def analysis(self):
        if self.ent1.get() == '' or self.ent2.get() == '':
            self.text.insert('1.0', 'フォルダと拡張子と検索語を入力してください')
            return
        
        predict_df = predict_model(self.load_reg_model, data = self.df)
        
        # 予測結果をファイルに保存する
        predict_df.to_csv(now + '_predict.csv', index=False, encoding='utf-8')
        
app = App()
app.mainloop()

以上

<広告>