lisz-works

プログラミングと興味を貴方に

tkinterで簡単なGUIをPythonで作る!

【スポンサーリンク】

Python

最近tkinterというものを使ってみました! PythonでGUIのアプリを作るライブラリの1つです。

簡単なGUIを、割と簡単に作ることができたので結構よさげ!

qiita.com

インストール

Windowsでは、Pythonパッケージのインストール時。
Linuxでは、apt-getでインストールするようです。

ぼくの環境は恐らくデフォルトチェックされていたため、既に入っていました。

正しくインストールされていると、次のように python -m tkinter として、 ポップアップが表示されます。 引用:Tkinter のインストール - Python 入門

との事なので、とりあえず試したらちゃんと表示がされました。

テストウィンドウ

試してみた

下記ソースを適当な.pyファイルで保存して実行すればOK。

# -*- coding: utf-8 -*-
# author lis
# http://www.lisz-works.com

import tkinter as tk

# buttonのクリックイベント
def pushed(self):
    print("clicked")            # コンソールに表示
    self["text"] = "clicked"    # 渡したオブジェクトのテキストを変更
# evButtonのクリックイベント
def ev(self):
    self["text"] = "押したね!"

# メインウィンドウの生成
root = tk.Tk()

# タイトルを変更
root.title("test tk")
# サイズ変更
root.geometry("640x480")

# ラベル
label = tk.Label(root, text="TestLabel")
label.grid()    # このパーツをウィンドウにセット

# ボタン
# commandはコールする関数
#button = tk.Button(root, text="TestButton", command="pushed")
# commandをラムダ関数にして、pushedに自身(button)を渡す
button = tk.Button(root, text="TestButton", command= lambda : pushed(button))
button.grid()   # このパーツをウィンドウにセット

evLabel = tk.Label(root, text="ボタンを押してね")
evLabel.grid()  # このパーツをウィンドウにセット
evButton = tk.Button(root, text="押せ", command=lambda : ev(evLabel))
evButton.grid() # このパーツをウィンドウにセット

# メインウィンドウは最後にコレをする
# rootを表示させるためのループ
root.mainloop()

実行するとこんな感じで表示されます。

実行結果

ソースの内容

大まかな流れとしては、「root」という変数に、メインウィンドウをセットします。
そしてrootに対して、画面の構成要素やプロパティを設定していく感じです。

今回はボタンを2つ用意してみました。

上のボタンは、押すことでボタンのラベルが変わります。
同時にコンソールにも出力を行います。

下のボタンは、押すことで1つ上のラベルの内容が変わります。

tkinterのメリット

GUI作成といえば以前、Kivyを試してみました。

www.lisz-works.com

Kivyと比べてtkinterは、UI作成するためのコードがかなり簡素に感じました。

超ざっくりな感覚はこんな感じ。

使うもの 簡易さ 柔軟性
Kivy
tkinter

Kivyの場合、「この名前でこれを用意して……」というの多々あった印象。 対してtkinterは、構成要素と対応する関数を登録するような簡素な作りです。

逆を返せば、それだけ簡素なものしか作れないかもしれません。
(まだ触りしかやってないので、なんともですが)

KivyはUI用ファイルを外部化できたり、UIと変数を連動したり……
といった複雑なことができる故に、複雑なGUIアプリを作ることが可能だと思います。

その辺は一長一短だなぁというところで。

あとがき

ということでtkinterのご紹介でした。

作業をするうえで、簡単なものをちょちょっと作る程度なら、tkinterでいいかなぁって感じですね。