Python(tkinter003: 子の要素の変更_winfo_children)

■フレームの上にのる要素の変更の方法。
前回、for文を使って複数のウィジットを作成したけど、その作成したウィジットを変更したい場合について調べてみた。
複数のウィジットを作成するときのサンプルコードが下のもの(ラベルフレーム上にラジオボタンを3つ作成)。

        self.LF1 = ttk.LabelFrame(self.opt_frame, text='Function')
        self.LF1.pack(side='left')
        self.LF_var = ttk.StringVar()
        graph_kinds = ('quad', 'sin', 'log')
        LF_column = 0
        for kind in graph_kinds:
            self.Rd1 = ttk.Radiobutton(self.LF1, text=kind, value=LF_column, variable=self.LF_var, command=self.setFunction)
            self.Rd1.grid(column=LF_column, row=0, ipadx=10, ipady=10)
            LF_column += 1
        self.LF_var.set(0)

この時の表示は、下の図のようにFunctionのタイトルのもとquad, sin, logのラジオボタンができる。上のコードのself.Rd1で指定して要素を変更すると一番最後に作ったlogしか変更されない。

いちいちウィジットの作成時に固有の名前をつける必要があるなら、多くのウィジットを使う場合コードが煩雑になる。デバッガで情報を見てみると、ラベルフレーム(LF1)の中にラジオボタンが入っているのは分かる。LF1.childrenで変更してもうまくいかなかった。

何か手はないか調べると、winfo_childrenを使えばいいよう。使い方は、子の要素をすべて変えるなら下のようなコードでできた。

            for child in self.LF1.winfo_children():
                #child.configure(state="normal")
                child.configure(state="disable")

実行結果が下のもの。
quad, sin, logとすべてのラベルフレーム配下のウィジットが無効化(disable)された状態となっている。

以前、Visual basicを使ったときに、一つ一つボタンに名前を付けてたけど、こういった作り方ができたかも。