AI・ロボットに向けてPythonのTkinterを試してみる

ゴールデンウィークまでカウントダウンですね。色んなことを中途半端に試している間に前回の記事から大分間が空いてしまいました。

最近試しているのはAIやロボット関連の技術が多いのですが、Pythonから利用するものが大半で、改めて今Pythonが旬な言語になっているんだなと感じます。

そこで今回は、PythonでAIとロボットを作ってみる…のではなく、その際に何かと便利に使えそうな、Pythonの標準GUIライブラリTkinterで、情報を出力する方法を簡単にまとめてみたいと思います。尚、記事中のコードはすべてPython3系です。

Tkinter

TkinterはPythonに標準で付属する、TkベースのGUIライブラリです。見た目もソフトの作りも若干古い感じですが、Pythonから気軽にGUIによる入出力が作成できるのが利点です。

ちなみにTkinterについて詳細を解説している書籍は、Kindleの英語版のみになってしまいますが、Modern Tkinter for Busy Python Developersあたりが内容もまとまっており、お値段も792円と手ごろです。

Tkinterの動作を確認する

Tkinterの動作は次のコードで確認できます。

import tkinter
tkinter._test()

実行すると、Tck/Tkのバージョンを表示するtkinterベースのウィンドウが表示されます。

f:id:tkitao:20170423173720p:plain

やはり微妙な古臭さが漂いますが、お手軽なので我慢我慢。

ボタンを押せるようにする

import tkinter as tk
import sys

def on_press():
    sys.exit(0)

root = tk.Tk()
button = tk.Button(root, text="exit", command=on_press)
button.pack(fill="both")

root.mainloop()

f:id:tkitao:20170425215657p:plain

ボタンを押した際の挙動はcommandオプションで指定します。

図形を描画する

import tkinter as tk

root = tk.Tk()
root.geometry("400x300")
canvas = tk.Canvas(root, width=400, height=300)
canvas.pack()

canvas.create_rectangle(100, 100, 300, 200, fill="green")

root.mainloop()

f:id:tkitao:20170425215705p:plain

描画で使えるコマンド一覧はこちら

長文テキストを表示する

短にテキストボックスを置くのではなく、スクロールバーと連携させてみます。

import tkinter as tk

root = tk.Tk()
text = tk.Text(root, height=10, width=40)
text.pack(side=tk.LEFT, fill=tk.Y)
scroll = tk.Scrollbar(root)
scroll.pack(side=tk.RIGHT, fill=tk.Y)
scroll.config(command=text.yview)
text.config(yscrollcommand=scroll.set)

for i in range(50):
    text.insert(tk.END, "message" + str(i) + "\n")

root.mainloop()

f:id:tkitao:20170425215717p:plain

リストを表示する

import tkinter as tk

root = tk.Tk()
listbox = tk.Listbox(root)
listbox.pack(fill="both")

listbox.insert(tk.END, "item1")
listbox.insert(tk.END, "item2")
listbox.insert(tk.END, "item3")

root.mainloop()

f:id:tkitao:20170425215731p:plain

画像を表示する

jpgやpngなどの画像を表示するにはPython Imaging Libray(PIL)を使う必要があります。

import tkinter as tk
import PIL as pil
import PIL.ImageTk

root = tk.Tk()
photo = PIL.ImageTk.PhotoImage(pil.Image.open("cat.jpg"))
label = tk.Label(image=photo)
label.image = photo # keep a reference
label.pack()

root.mainloop()

f:id:tkitao:20170425215741p:plain

ということでさっと情報を表示したいときに使えそうなサンプルコードを並べてみました。

AIやロボットを作る際に役立つといいですね。