【Python】GUIアプリを作ってみる【Tkinter編】※初心者向け


管理人
tkinterでGUIを作ってみました

tkinter は python 標準のライブラリです。

 

piyo
GUI をやりたいのですが、色々ライブラリがありすぎてどれが良いのか迷っています。

という方、tkinterはライブラリの追加インストールが不要なので、GUI入門にはピッタリです。
まずは試してみてはいかがでしょうか。

 


最初に

tkinterとは

Wikipediaによると、、、

Tkinter は Python からGUIを構築・操作するための標準ライブラリ(ウィジェット・ツールキット)である。

Tcl/Tk の Tk 部分を Python で利用できるようにしたもので、使い方も可能な限り Tcl/Tk にあわせられるように作られている。

「Tkinter」『フリー百科事典 ウィキペディア日本語版』より。
2019年12月29日 (日) 13:02 UTC
URL: https://ja.wikipedia.org/wiki/Tkinter

Tk は Took Kit の略で、 GUI に必要な要素(ボタンやテキストボックスなど)を提供しているライブラリです。

 

Tkinterの特徴として、

  • ライブラリのインストールが不要
  • Python標準のため、参考とする書籍やWebサイトなどが充実している
  • 起動が早い

などが挙げられます。

 

※参考までに、Python の他のGUIライブラリをまとめた記事がありますので、併せてご覧いただければと思います。
【python】GUIライブラリ13個を比較【初心者にオススメもあります】

 

管理人
さっそくtkinterを試します。

 

pythonでGUIアプリを作ってみる【Tkinter編】

開発環境

  • OS Windows 10
  • Pythonバージョン 3.8.0

 

使用するライブラリ

GUIを作るだけなら、「Tkinter」だけでOKです。

※Tkinter は python標準のため、追加のライブラリのインストールは不要です。

 

サンプルプログラム 基礎:GUIの表示

まずは何も考えず、画面だけ表示するプログラムを作ってみます。

ソースコード

import tkinter #tkinter ライブラリのインポート

root = tkinter.Tk() #Tkオブジェクト生成
root.title(u"テストその1") #GUIのタイトル名の決定
root.geometry("300x300") #画面の大きさの決定

root.mainloop() #イベントループ

 

コメントを見てもらえれば、ほぼ理解できるかと思います。

最後の7行目だけ補足をすると、これは、画面を表示し、指令(ボタンのクリックなど)を待つ処理となります。

こちらの mainloop メソッドを実行することで、はじめて画面が表示されます。

 

以上の、

  1. tkinter ライブラリのインポート(1行目)
  2. Tkオブジェクト生成(3行目)
  3. GUIの設定(4,5行目)※作りたい画面に応じて設定
  4. イベントループ(7行目)

が、 tkinter でGUIを作る場合の基本の型となります。

 

実行結果

 

C# や、 C の OpenGL で画面を作ったことはありますが、デフォルトのライブラリでもこんなに短くGUIが作れるのですね!

 

piyo
基本の型を理解していれば、いろいろ応用できそうですね!
管理人
次はちょっとした応用です。

サンプルプログラム 少し応用:matplotlibとの連携

ちょっと応用編ということで、

  1. GUIのテキストボックスに入力したファイルを読み込み、
  2. GUI上にグラフを描画させる

ようなプログラムを作りたいと思います。

matplotlib を Canvas と紐づけてグラフを画面に表示させます。

 

ソースコード

import tkinter #GUIライブラリ
import matplotlib.pyplot as plt #グラフ描画ライブラリ
from matplotlib.backends.backend_tkagg  import FigureCanvasTkAgg #tkinterとCanvasを紐づけるライブラリ
import numpy as np #数値計算ライブラリ
from functools import partial

#終了処理
def Quit():
    root.quit()
    root.destroy()

#ファイルのプロット処理
def PlotFile(canvas, ax, colors = "gray"):
    editBoxValue = FileEditBox.get()
    if editBoxValue != '':
        FileEditBox.delete(0, tkinter.END)
        ax.cla() #前の描画データの削除
        x,y = np.loadtxt("./" + editBoxValue, delimiter = ',', skiprows = 1, unpack = True) #データ読み込み
        ax.set_aspect('equal') #アスペクト比をそろえる
        ax.plot(x, y) #グラフの描画
        canvas.draw() #Canvasへ描画

if __name__ == "__main__":
    try:
        #tkinterオブジェクト生成
        root = tkinter.Tk()
        root.title("ほげほげ") #GUIタイトル
        
        #graphの設定
        fig,ax1 = plt.subplots()
        fig.gca().set_aspect('equal', adjustable = 'box')

        #Canvas設定
        Canvas = FigureCanvasTkAgg(fig, master = root) #Canvasにfigを追加
        Canvas.get_tk_widget().grid(row = 0, column = 0, rowspan = 10)

        #EditBox
        FileEditBox = tkinter.Entry(width = 15)
        FileEditBox.grid(row = 1, column = 1)

        #UPDATEボタン
        ButtonWidth = 15
        UpdateButton = tkinter.Button(text="UPDATE", width=ButtonWidth, command=partial(PlotFile, Canvas, ax1))#ボタンの生成
        UpdateButton.grid(row = 2, column = 1, columnspan = 1)#描画位置 

        #QUITボタン
        QuitButton = tkinter.Button(text = "QUIT", width = ButtonWidth, command = Quit) #QUITボタンオブジェクト生成
        QuitButton.grid(row = 4, column = 1, columnspan = 1) #Quitボタン位置設定

        #Canvasの描画
        PlotFile(Canvas, ax1)

        #描画を継続
        root.mainloop()

    except:
        import traceback
        traceback.print_exc()

    finally:
        input(">>")

基本的にコピペで動くはず。

try と except 、finally は例外処理です。(try の部分だけ書けば動きます。)

 

テキストボックスやボタンなど、GUI を構成する要素を Widget といいますが、今回は、

  • グラフを表示する Canvas ウィジェット
  • ファイルを入力する Entry ウィジェット(テキストボックス)
  • 描画や終了などの指示をする Button ウィジェット

を使用しています。

これらの Widget を、Grid メソッドを使い、画面に配置しています。

 

Widget や Grid メソッドの詳細については、次の記事をご参考いただければと思います。

【python】tkinterのWidgetの配置方法

 

入力ファイル

※ソースファイルと同じディレクトリに配置

x,y
1,0.1
2,0.4
3,0.9
4,1.6
5,2.5
6,3.6
7,4.9
8,6.4
9,8.1
10,10

 

実行結果

・初期表示

・テキストボックスに「hoge.csv」と入力して、「UPDATE」押下。

無事にグラフが表示されましたー^^

 

 

■ご参考にさせていただいたサイト

MatplotlibにGUI(Tkinter)を組み合わせる話」(Shts!様)

 

使ってみた感想

Tkinter でGUIアプリを作ることができました。

 

一般的なエクセルマクロなどで作れるようなGUIなら問題なく作れそうな気がします。

 

本格的に学びたいかたは、下記の書籍でも取り扱っているので、ご覧いただければと思います。

 

管理人
最後までご覧いただきありがとうございました。