楽して使うTkinter(ウィジット編)
同じコードをコピペするというのはその場では簡単かもしれませんけれども後々地獄になりがちです。ちょっとした動作の変更をしたいのに直す場所が多数、しかも分散していて、とか目も当てられません。
ずぼらに楽をするには一か所直せばすべて直るくらいの勢いでスマートにやりたいものです。
今回はよくある疑問でよく目にする
- ラベルの文字って後からどうやって変えるのー?
あたりをやってみましょうか。
じぶんLabelウィジットクラスを作る。
tk.Labelを継承して じぶんラベル を作ります。
じぶんウィジットなので好きなように作ります。ポイントは毎回毎回書いていてめんどくさいなっていう部分はフォローしておくこと。
自分自身が使いやすければ、少なくとも自分しか使わないなら。最悪動作するならば何も問題ありません。好きにやりましょう。
import tkinter as tk
class Label(tk.Label):
def __init__(self, root, cnf={}, **kw):
super().__init__(root, cnf, **kw)
# tkinterで動的に内容を変えるにはWidget変数を使う
self.val = tk.StringVar()
self["textvariable"] = self.val
keys = kw.keys()
# 引数でテキストが渡されていたらwidget変数に入れてやる
if "text" in keys:
self.set(kw["text"])
# 引数で以下が渡されていない場合は左揃えになるように
# 設定しておく。
if not "anchor" in keys:
self["anchor"] = "nw"
if not "justify" in keys:
self["justify"] = "left"
def set(self, text):
self.val.set(str(text))
def get(self):
return self.val.get()
わたしはラベルが中央ぞろえになるのがどうも苦手というか毎回面倒に思うので左に揃うようにしてみました。
あとはラベルの内容を変更・取得するための set, get を定義、ひとまずこんなもんでしょうか。
さらに突っ込むなら色だとかフォントだとかも弄っておくと楽かもしれませんねー。
使ってみよう。
作った label.py と同じ場所に適当なスクリプトをつくって試します。
import tkinter as tk
import label
import random
root = tk.Tk()
l = label.Label(root, text="hello")
l.bind("<Button-1>", lambda x: print(l.get()))
l.bind("<Button-3>", lambda x: l.set(random.randint(1,10)))
l.pack(fill="x")
root.mainloop()
こんな感じ。機能を試すため、ラベルを左クリックでラベルの内容がコンソールに表示されて、ラベルを右クリックするとランダムに選ばれた数字がラベルに設定されますよ。
〆
今回ラベルウィジットに関してやってみたけど、これはエントリーとか他も大体一緒。とにかく楽をするためには、お決まりの処理はまとめておく こと。これはとっても大切、約束だよ!