MENU
Apple製品を安く買うなら!詳細はこちら→ CLICK!

【Python】TkinterでExcel・PowerPoint・PDF等を操作するGUIアプリを作成!

本ページにはプロモーションが含まれています。
pythonのGUIアプリ

こんにちは、fuyutsuki(@Fuyutsuki)です。

Fuyutsuki

Pythonでユーザー目線のGUIアプリを作成したいと思った事はありませんか?

そのような時に活躍するのがpython標準ライブラリの「Tkinter」です。

Fuyutsuki

ライセンスの心配がない・コードのテンプレを作れば使い回しが容易なことが大きな強みです!

今回は、実際に私がtkinterで作成したPythonコードのテンプレを解説します!

Excelだけでなく、PDFやパワーポイントなどにも応用は容易です。(Excelと指定している箇所をPDFやPowerPointに書き換えれば済むだけの話なので)

それではさっそく解説に入ります。

目次

Pythonの仮想環境構築

tkinterでコードを記述する前に、以前記事で解説したように仮想環境を構築しておきましょう。

個人的におすすめしたいのは、virtualenvによる仮想環境構築の方法です。

記事で解説したバッチファイルをダブルクリックするだけで仮想環境構築が完了するので、まだチェックしていない方はぜひ見てみてください。

今回は以下のようなバッチファイルを作成しましょう。

@echo off
rem スクリプトが置かれている場所をカレントディレクトリにする。
cd /d %~dp0

rem 念のためvirtualenvのインストールとpipのアップグレードを行う。
pip install virtualenv
python -m pip install --upgrade pip

rem vENVの環境を構築する。
python -m venv vENV
call ./vENV/Scripts/activate

python -m pip install --upgrade pip
rem 各パッケージをインストール
pip install openpyxl
pip install pyinstaller
pip install pandas
pip install numpy
pause

TkinterでGUIアプリを作成

回りくどいことは言わず、結論として以下のコードでPythonのエクセル操作するGUIアプリが作成できます。

Fuyutsuki

こちらのコードは私が試行錯誤していきついたコードです。他のサイトにはないコードなので参考になると思います。

import os,sys
import openpyxl as px
import tkinter
from tkinter import Tk,StringVar,ttk,filedialog,IntVar,messagebox,LEFT
import re

#参照ボタンクリック時
def ref_clicked():
    fTyp = [("EXCELファイル","*.xlsx")]
    iDir = os.path.abspath(os.path.dirname(__file__))
    filepath = filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)
    if len(filepath) == 0:
        refpath.set(u'選択をキャンセルしました。もう一度"参照"ボタンをクリックしてください。')
    else:
        refpath.set(filepath)

# スタートボタンクリック時
def start_clicked(fp,text):
    if fp:
        wb = px.load_workbook(fp)
        #シートのインデックスからWorksheetオブジェクトを取得
        ws = wb.worksheets[0]
        # textから空白以外の文字列を一文字ずつリストに格納
        textlist = [n for n in text if n != ' ']
        # Count用のi,jを定義
        i, j = 0, 0
        deletelist = []
        #データを処理する行の一つ上のセルの行を取得する。
        for rows in ws.iter_rows(min_row=1,min_col=1,max_row=ws.max_row,max_col=1):
            i += 1
            # リストをループ
            if i < ws.max_row + 1:
                for id in textlist:
                    if id in ws.cell(row=i, column=1).value:
                        j += 1
                # textの文字が3つ以上cellの値と合致していたら行を削除する。
                if j >= 3:
                    j = 0
                    # リストにiの値を追加
                    ws.delete_rows(i)
                else:
                    j = 0
        # 対象の行をまとめて削除
        firstloop = True
        count = 0
        for x in deletelist:
            if firstloop:
                ws.delete_rows(x)
                firstloop = False
                count += 1
            elif firstloop == False:
                # 行の削除に合わせて、xの値を調整する。
                x = x-count
                ws.delete_rows(x)
                count += 1
        fp_save = fp + '_AfterProcessing'
        fp_save = fp_save.replace('.xlsx','')
        fp_save = fp_save.replace('.xlsm','')
        # 正規表現で検索
        if re.search(r'.xlsx', fp):
            fp_save = fp_save + '.xlsx'
        if re.search(r'.xlsm', fp):
            fp_save = fp_save + '.xlsm'
        #編集したエクセルを保存する。
        wb.save(fp_save)
        #解析終了のメッセージボックスを表示する。
        messagebox.showinfo('Finish', 'データ処理が終了しました')

if __name__ == '__main__':
    # ウインドウの設定
    root = Tk()
    root.title('~tkinter Excel line delete app~')
    root.resizable(False, False)

    # Frame1の作成
    frame1 = ttk.Frame(root, padding=10)
    frame1.grid()

    # 参照ボタンの作成
    button1 = ttk.Button(root, text=u'参照', command=ref_clicked)
    button1.grid(row=0, column=1)

    #ファイルラベルの作成
    s = StringVar()
    s.set('ファイル>>')
    filelabel = ttk.Label(frame1, textvariable=s)
    filelabel.grid(row=0, column=0)

    # 参照パスラベルの作成
    refpath = StringVar()
    refpathtextbox_entry = ttk.Entry(frame1, textvariable=refpath, width=54)
    refpathtextbox_entry.grid(row=0, column=1)
    refpathtextbox_entry.insert(tkinter.END,u'"参照"ボタンを押して、解析するExcelファイルを選択してください。')
    # ユーザーがテキストボックスを編集できないようにする。
    refpathtextbox_entry.configure(state='readonly')

    # frame2の作成
    frame2 = ttk.Frame(root, padding=10)
    frame2.grid()

    # テキストボックスラベルの作成
    t = StringVar()
    t.set('重複したら削除するIDを入力してください(例: B C D)>>')
    textlabel = ttk.Label(frame2, textvariable=t)
    textlabel.grid(row=1, column=0)

    # テキストボックスの作成
    text = StringVar()
    textbox = ttk.Entry(frame2, textvariable=text, width=20)
    textbox.grid(row=1, column=1)

    # frame3の作成
    frame3 = ttk.Frame(root, padding=(0,5))
    frame3.grid(row=3, column=0)
    # Startボタンの作成
    stButton = ttk.Button(frame3, text='Start', command=lambda: start_clicked(refpath.get(),text.get()))
    stButton.pack(side=LEFT)
    # Cancelボタンの作成
    button3 = ttk.Button(frame3, text='End', command=lambda: sys.exit())
    button3.pack(side=LEFT)

    # 実行
    root.mainloop()

実行すると、以下のようなGUIアプリが表示されます。

pythonのGUIアプリ

”参照”ボタンを押すことで、ファイル選択ダイアログが開き、Pythonで操作したいファイルをユーザーが選択することができます。

今回は例として、「テキストボックスに入力したIDとエクセルの行が一致していればエクセルの行を削除する」とうコードを書いています。

Fuyutsuki

ここのコードは、自身の実現したい操作に合わせてコードを書き換えてください。

具体的には、スタートボタンクリック時の”if fp:”より下のコードを書き換えていただければOKです。

ExcelでもPowerPointでもPDFでもPythonで処理したいコードを記述すれば、GUIアプリで選択したファイルに対して処理を行うことができます!

まとめ:TkinterでPythonのGUIアプリを作ろう

今回の記事ではPythonのTkinterを用いて実践的なGUIアプリを作成する方法を解説しました。

今回紹介した記事をベースにすれば、GUIアプリで、ファイル選択ダイアログから処理するExcel,PowerPoint,PDFを選択し、各ファイルに対してPythonの操作を行うことが可能となります!

幅広く応用の効く内容となっておりますのでぜひコードをチェックしてみてください。

また、作成したGUIアプリを配布する方法はこちらの記事で解説しています。

簡単な手法でPython環境を構築せずともGUIアプリを実行できるようになるため、配布する方法としてはおすすめです。

また、プログラミングを学習したいと思っている方はこちらの記事で紹介しているように、買い切り型のオンライン動画学習サービスUdemyがおすすめです。講師の方々のレベルがとても高いことが特長です。

独学でのプログラミング学習:Udemy
Udemy登録後画面

独学でプログラミング学習をするなら、まずおすすめしたいのがUdemyです。オンライン動画買い切り形式で、実務レベルのスキルを習得できます。定期的に80~90%OFFセールが実施されていますよ。

\ セール中は80~90%OFFで購入可能/

30日間返金保証

最後まで読んでいただきありがとうございました。ではまた、次の記事で!

pythonのGUIアプリ

この記事が気に入ったら
フォローしてね!

この記事を書いた人

快適なデスク環境で作業効率アップをテーマに、様々なガジェットを紹介している20代エンジニアです。

作業効率化につながるようなプログラミングの情報についても発信中。

コメント

コメントする

目次