なぜかsettei_button.set(0)
を実行しても1番目のところに印が入る
python
1def btn_settei_click(): 2 tki_settei_log = tkinter.Tk() 3 tki_settei_log.geometry('300x300') 4 tki_settei_log.title('設定') 5 6 settei_button = tkinter.IntVar() 7 8 settei_button.set(0) 9 10 auto_on = tkinter.Radiobutton(tki_settei_log, value=0, variable=settei_button, text='ON') 11 auto_on.place(x=20, y=50) 12 auto_off = tkinter.Radiobutton(tki_settei_log, value=1, variable=settei_button, text='OFF') 13 auto_off.place(x=20, y=70)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
原因
ラジオボタンの初期値の設定のタイミングは、関数の実行後 (mainloop内)で処理されるが、
関数を抜けた後には IntVar が参照できなくなっている。
解決策1: グローバルで IntVar() を準備する
python
1import tkinter 2 3root = tkinter.Tk() 4settei_button = tkinter.IntVar() 5 6def init_radio_buttons(): 7 dialog = tkinter.Toplevel() 8 dialog.geometry('300x300') 9 dialog.title('設定') 10 11 settei_button.set(0) 12 13 auto_on = tkinter.Radiobutton(dialog, value=0, variable=settei_button, text='ON') 14 auto_on.pack() 15 auto_off = tkinter.Radiobutton(dialog, value=1, variable=settei_button, text='OFF') 16 auto_off.pack() 17 18tkinter.Button(root, text="設定", command=init_radio_buttons).pack() 19root.mainloop() 20
解決策2: グローバル宣言する
python
1 2import tkinter 3 4root = tkinter.Tk() 5 6def init_radio_buttons(): 7 global settei_button ### <--- グローバル宣言 8 9 dialog = tkinter.Toplevel() 10 dialog.geometry('300x300') 11 dialog.title('設定') 12 13 settei_button = tkinter.IntVar() 14 settei_button.set(0) 15 16 auto_on = tkinter.Radiobutton(dialog, value=0, variable=settei_button, text='ON') 17 auto_on.pack() 18 auto_off = tkinter.Radiobutton(dialog, value=1, variable=settei_button, text='OFF') 19 auto_off.pack() 20 21tkinter.Button(root, text="設定", command=init_radio_buttons).pack() 22root.mainloop() 23
※ 対策としてはこちらの方が簡単と思われるかもしれませんが、お勧めではありません。
関数外で settei_button.get() を読み出すとき、settei_button が未定義になるかもしれない為、
変数が定義されてるかのチェックが必要になり、結果的にはこちらの方が手間になります。
他にはダイアログ部分をクラス化する等の手段もあります。
重要なのは、IntVar を格納した変数を破棄せずに残すという点です。
投稿2020/05/27 07:04
総合スコア8722
0
ベストアンサー
コードを実行可能な形で掲載できますか?
また、「違うところに印が入る」は何処で、何処に入るのを期待しているのでしょう?
コード自体は正常に動作してます。
(もし、質問の意図が誤動作しているということであれば、掲載されたコード以外に問題があります)
気になる点は、 0 -> ON, 1 -> OFF になっているので、
もし設問が set(0) -> OFF を期待しての動作なら、 Raddiobutton のvalueが誤りです。
追記: 以下のコードでは set(0) で起動時に ON (value=0) になるのを確認しました。
python
1import tkinter 2 3if __name__ == '__main__': 4 5 tki_settei_log = tkinter.Tk() 6 tki_settei_log.geometry('300x300') 7 tki_settei_log.title('設定') 8 9 settei_button = tkinter.IntVar() 10 11 settei_button.set(0) 12 13 auto_on = tkinter.Radiobutton(tki_settei_log, value=0, variable=settei_button, text='ON') 14 auto_on.place(x=20, y=50) 15 auto_off = tkinter.Radiobutton(tki_settei_log, value=1, variable=settei_button, text='OFF') 16 auto_off.place(x=20, y=70) 17 18 tki_settei_log.mainloop() 19
投稿2020/05/26 06:43
編集2020/05/26 11:43総合スコア8722
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/26 10:15
2020/05/26 11:37
2020/05/26 11:37
2020/05/26 11:59 編集
2020/05/26 11:48
2020/05/27 05:16
2020/05/27 05:18
2020/05/27 05:28 編集
2020/05/27 05:29
2020/05/27 06:07
2020/05/27 06:29
2020/05/27 06:37
2020/05/27 06:39
2020/05/27 06:41
2020/05/27 06:47
2020/05/27 06:50
2020/05/27 07:02
2020/05/27 07:08
2020/05/27 10:31
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。