dondakeshimoの丸太

データサイエンス/Webアプリケーション/

tkinterで機械学習用の学習データを作成したわ

初心者がtkinter使いました

こんにちは。今回は初回記事の方でしれっと言ってた初作品について投稿していきたいと思います。機械学習の前処理を行うための画像情報抽出GUIアプリ」を作るということでした。筆者は一回webアプリを勉強するのを挫折した経緯というか、javascriptやらhtmlやらめんどくさった経緯というか、、がありまして、今回はデスクトップアプリを作るぞ!と決意いたしました!!私が読んだ入門書にPythonのデスクトップアプリを作るライブラリとしてtkinterが挙げられていたので、素直に使ってみました!

できたもの

f:id:went-went-takkun135:20170612172115p:plain

これでsaveボタンを押したら、うまい具合にxmlファイルへ人がいる座標を出力してくれるという寸法です。誰が使うねん!ってなるでしょうが一応コードのリンクを張っておきますね。

https://github.com/dondakeshimo/what-I-made/tree/master/FB_pj_UI

今回勉強できたこと

アプリを画面幅いっぱいにする

from tkinter import *

root = Tk()
scr_w, scr_h = root.winfo_screenwidth(), root.winfo_screenheight()
root.geometry("%dx%d+0+0" % (scr_w, scr_h))

このメソッドでデバイスの縦横の大きさがピクセル単位で返ってきます。アプリは画面いっぱいでないとね!!写真扱うんだし!!(ウィンドウとオブジェクトのサイズを同期させるのが面倒だったとは言っていない。)

画像の開き方とサイズ変更

カレントディレクトリに"picture.png"があるとしましょう。

from PIL import Image, ImageTk

original = Image.open("picture.png")
resized = original.resize((100, 300), Image.ANTIALIAS)
tk_img = ImageTk.PhotoImage(resized)

これでサイズ変更された、tkinterの画像オブジェクトが生成されたことになります!

矩形選択

概要

写真はtkinterのcanvasの上に貼り付けてるんですが、canvasにクリックした時と離した時のイベントをバインドして、その時の座標を用いて矩形を描画しています。

問題点

  • クリックを離してみるまで矩形選択の描画されないため、正しく選択するのが難しいというところ。
  • 矩形選択を削除することができないこと

解決策

  • イベントバインドにドラッグも入れてその座標を逐次渡すことで点線なりの矩形を描画すれば良いのだろうか。
  • 削除するために矩形選択自体を選択せねばならぬ気がするのだがやり方がさっぱりだったため、チェックボタンで代用した。

チェックボタン

矩形選択ミスった時用に、チェックボタンを苦肉の策として導入。矩形選択に番号を振り、ミスった番号のチェックボタンを外すことで、その選択は無視するようにコーディングしました。しかもこのチェックボタン、自動生成とか難しそうだったから、Person10までは後ろに隠れてて、矩形選択するたびにしたからPower Pointでいう「最前面へ移動」を行っておるだけです。なんかいろいろ納得いかないので、誰かうまいやり方教えてください。

xmlファイル

基本的なことのみ行いましたので、ここでは割愛させていただきますが、xml.etree.ElementTreeを使って書いたということだけ申し上げておきましょう。

辞書型に感動

fortranとかCとかを主に勉強してた筆者にとって、入門書読んだ時、辞書型と聞いても全然ピンとこずに「なんかこいつは便利そうだ」くらいにしか思ってなかったんですけど、辞書型、やばいっすね。インデックスじゃなくてキーになるだけでこんなにもコードが簡単に美しくなるとは。そりゃDBもキーと値で格納しますよ、わかりますよ。fortranでコード書いてた時のあの名前めっちゃ思案して、入れ子不可のリストに値を入れていくやつめっちゃキツかったなぁ、と思い出しながらしんみり感動してました。

最後に

ここまで説明してなんだけど、webアプリの方がたぶん流行ってるよ。笑

参考にしたサイト