TkとWmとMiscの関係
Tkinter のルート widget(?) である Tkinter.Tk は Wm と Misc, 2つのクラスを継承してる。
とっつきやすそうな Wm (Window Manager)に目をつけて闇雲にメソッドを呼んでみる。
>>> import Tkinter >>> wm = Tkinter.Wm() >>> wm.wm_aspect() File "", line 1, in wm.wm_aspect() File "D:\Python25\lib\lib-tk\Tkinter.py", line 1419, in wm_aspect return self._getints(AttributeError: Wm instance has no attribute '_getints'
まぁ、そんなもんか。メソッドが足りない模様。
_getints ってどこで定義されるの?
検索で一周してファイルの上の方に戻ったら class Misc で定義されてた。
最初に書いたように、Misc は Tk のもう一つのスーパークラス。
てことは、Wm は一緒に Misc が継承されることを前提としている?
オブジェクト指向的にそんなのありだっけ?
単純化するとこういう構造。
>>> class SuperA: def methodA(self): return 'A' >>> class SuperB: def methodB(self): return self.methodA() + 'B' >>> class Hoge(SuperA, SuperB): pass >>> h = Hoge() >>> h.methodB() 'AB'
Misc._getintsって?
def _getints(self, string): if string: return tuple(map(getint, self.tk.splitlist(string)))
今度は self.tk なるインスタンス変数を参照している。
これがどこにあるかというと、サブクラスのTkの中。
class Tk(Wm, Misc): def __init__(self, ...): # (中略) self.tk = _tkinter.create(...)
どうもこの3つのクラスは依存関係がややこしそうだなぁ。
で、Misc._getints って?
まず、self.tk.splitlist の正体をさぐる。
>>> import Tkinter >>> tk = Tkinter.Tk() >>> tk.tk.splitlist('a b c') ('a', 'b', 'c') >>> tk.tk.splitlist('abc') ('abc',) >>> tk.tk.splitlist('a,b_c:d;e-f+g/h') ('a,b_c:d;e-f+g/h',) >>> tk.tk.splitlist('a\tb\nc d') ('a', 'b', 'c', 'd') >>> tk.tk.splitlist([1,2,3]) # エラー >>> tk.tk.splitlist(1) # エラー
文字列を空白文字で分割してるだけ。
残るは getint だけどこれはモジュール内でこうなってた。
getint = int
結局、Misc._getints ってのは、
文字列を空白で分割して int の tuple にして返す処理でした。