【Python】PythonでのGUI作成4

2025 年 1 月 17 日 by yamamotor

1.はじめに

前回に引き続き、TKinterを利用してPythonで画面を作成していきます。

今回はExcelファイルを取り込む機能を作成します。

2.Excelファイルを選択するためのボタンを作成する

今回はExcelでデザインした以下のレイアウトを作成します。

ファイルを選択すると、取り込んだファイル名称とシート数を表示します。

また、シート追加ボタンを押すと、取り込んだファイルに対して新規でシートを追加します。

上記を実装したソースを以下に記載します。

import tkinter
import tkinter.filedialog
import pandas as pd
from openpyxl import load_workbook

# グローバル変数の初期化
file_path = ""
excel_data = {}

def load_excel():
    global excel_data, file_path
    file_path = tkinter.filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx *.xls")])
    if file_path:
        try:
            if file_path.endswith('.xlsx'):
                excel_data = pd.read_excel(file_path, sheet_name=None, engine='openpyxl')
            else:
                excel_data = pd.read_excel(file_path, sheet_name=None, engine='xlrd')
            file_label.config(text=f"ファイル名: {file_path.split('/')[-1]}")
            sheet_label.config(text=f"シート数: {len(excel_data)}")
        except Exception as e:
            file_label.config(text=f"エラー: {str(e)}")
            sheet_label.config(text="")

def add_sheet():
    global excel_data, file_path
    if file_path:
        try:
            # 既存のExcelファイルを読み込み
            book = load_workbook(file_path)
            
            # 新しいシート名を自動生成
            new_sheet_name = f"NewSheet{len(book.sheetnames) + 1}"
            
            # 新しいシートを追加
            book.create_sheet(title=new_sheet_name)
            
            # 保存
            book.save(file_path)
            
            sheet_label.config(text=f"シート数: {len(book.sheetnames)}")
            result_label.config(text=f"新しいシート '{new_sheet_name}' を追加しました")
        except Exception as e:
            result_label.config(text=f"エラー: {str(e)}")

# Tkクラス生成
app = tkinter.Tk()
# 画面サイズ
app.geometry('600x400')
# 画面タイトル
app.title('Excel取り込み')

# ボタンの作成
load_button = tkinter.Button(app, text="ファイル選択", command=load_excel)
load_button.place(x=200, y=30)

# 新しいシートを追加するボタンの作成
add_sheet_button = tkinter.Button(app, text="シートを追加", command=add_sheet)
add_sheet_button.place(x=200, y=140)

# ファイル名とシート数を表示するラベルの作成
file_label = tkinter.Label(app, text="ファイル名称: ")
file_label.place(x=80, y=70)
sheet_label = tkinter.Label(app, text="シート数: ")
sheet_label.place(x=80, y=100)

# 結果を表示するラベルの作成
result_label = tkinter.Label(app, text="")
result_label.place(x=80, y=170)

# メインループの開始
app.mainloop()

上記を実行すると以下のようなウィンドウが表示されます。

『ファイルを選択』ボタンを押して、新規で作成して保存を行ったsample.xlsxを取り込みます。

選択後は以下のように画面が変化します。

シートを追加ボタンを押すと以下のように表示されます。

該当のExcelを確認すると、シートが追加されていることが確認できます。

コードの新しく使用した機能について解説します。

def load_excel():
    global excel_data, file_path
    file_path = tkinter.filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx *.xls")])
    if file_path:
        try:
            if file_path.endswith('.xlsx'):
                excel_data = pd.read_excel(file_path, sheet_name=None, engine='openpyxl')
            else:
                excel_data = pd.read_excel(file_path, sheet_name=None, engine='xlrd')
            file_label.config(text=f"ファイル名: {file_path.split('/')[-1]}")
            sheet_label.config(text=f"シート数: {len(excel_data)}")
        except Exception as e:
            file_label.config(text=f"エラー: {str(e)}")
            sheet_label.config(text="")

まず、excel_data と file_path をグローバル変数として宣言します。

これにより、関数の外部でもこれらの変数にアクセスして変更することができます。

次に、ファイルを選択するために、『tkinter.filedialog.askopenfilename』を使用しています。

複数のファイルを選択する場合には『tkinter.filedialog.askopenfilenames』を、フォルダを選択する場合には『tkinter.filedialog.askdirectory』を使用します。

また、引数にfiletypesを渡すことで、選択できるファイルを制限しています。
引数は見出し、パターンの順で記載します。

それ以降はファイルの拡張子別でエンジンを変更してExcelファイルを読み込んでいます。
こちらはTkinterとは関係がない部分なので割愛します。

読み取った後はラベルのテキストを変更して、ファイル名称とシート数を表示しています。

また、下記の記載もExcelファイルに対しての処理であり、Tkinterとは関係がないので説明は割愛します。

def add_sheet():
    global excel_data, file_path
    if file_path:
        try:
            # 既存のExcelファイルを読み込み
            book = load_workbook(file_path)
            
            # 新しいシート名を自動生成
            new_sheet_name = f"NewSheet{len(book.sheetnames) + 1}"
            
            # 新しいシートを追加
            book.create_sheet(title=new_sheet_name)
            
            # 保存
            book.save(file_path)
            
            sheet_label.config(text=f"シート数: {len(book.sheetnames)}")
            result_label.config(text=f"新しいシート '{new_sheet_name}' を追加しました")
        except Exception as e:
            result_label.config(text=f"エラー: {str(e)}")

3.終わりに

今回はTkinterで作成した画面にExcelファイルを取込み、処理を行いました。

後はPythonで行う処理を充実させるのみなので、色々なことが出来るかと思います。

タグ: , ,

TrackBack