質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

1794閲覧

ラジオボタンの設定に関わるintVar、stringVarの定義について

goki_gottan

総合スコア168

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2019/04/13 09:58

編集2019/04/13 10:40

tkinerを使用している時に、よく出てくる
StringVar() や intVar()について、
定義されていませんとなります。
⇒以前の質問で、自己解決しましたので、編集して質問させてください。

連続で何度もラジオボタンをon、offにはどうしたらいいですか。
下記コードだと、一回チェックしたら2回目は変わりません。

状態の変更

# 状態の変更 def change_state(): # チェックされているラジオボタンを取得 checked = v.get() if ( checked == 1 ): # radio1がチェックされていたら radio2.configure( state = "disabled" ) radio3.configure( state = "disabled" ) elif ( checked == 2 ): # radio2がチェックされていたら radio1.configure( state = "disabled" ) radio3.configure( state = "disabled" ) elif ( checked == 3 ): # radio3がチェックされていたら radio1.configure( state = "disabled" ) radio2.configure( state = "disabled" ) else: print("error") # ラジオボタンのグループ v = tkinter.IntVar() v.set(0) # ラジオボタン radio1 = tkinter.Radiobutton(text = u"項目1", variable = v, value = 1, command = change_state) radio1.place(x=50, y=160) radio2 = tkinter.Radiobutton(text = u"項目2", variable = v, value = 2, command = change_state) radio2.place(x=150, y=160) radio3 = tkinter.Radiobutton(text = u"項目3", variable = v, value = 3, command = change_state) radio3.place(x=250, y=160)

intVarの定義はどのようにしたら良いのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

いわゆる普通のラジオボタンの仕様は

(A) 同一グループ(同一のIntVarを指定したボタン群)の中で選択状態になるのはたかだか一つ
(B) 変えたいときは単に「新たに選択したいボタン」を押す

TkinterのRadioButtonはvariableの値がvalueの値に一致したらそのボタンが選択状態になり、非選択のボタンを選択状態にするとvariableの値が選択したボタンのvalueの値に自動的に変化するという仕様ですのでcommandに指定した関数change_stateでやるべきことは「何が選択状態なのかをIntValueの値をgetして調べるだけ」です。自分で状態をどうこうする必要はありません。

ご質問のコードではchange_stateで選択されていないボタンを非活性にして二度と選択できないようにしてしまっています。そのような仕様はラジオボタンの仕様としては奇妙に見えます。単に(B)の仕様に従った方が自然ではないでしょうか?

ちなみにcommandに指定した関数はラジオボタンがクリックされたら常に呼び出されます。未選択のボタンをクリックしたときはもちろんですが、選択済みのボタンをクリックしても起動されます。つまり選択状態が変わろうが変わるまいがクリックされたら起動されることになります。そういう意味ではchange_stateという関数名はちょっと違和感があり単にbutton_clickedでいいんじゃないかと思います。

python

1impot tkinter as tk 2 3... 4 5def button_clicked(): 6 print(f"selected button is {v.get()}") 7 8v = tk.IntVar() 9v.set(0) 10 11radio1 = tk.Radiobutton(text="項目1", variable=v, value=1, command=button_clicked) 12radio2 = tk.Radiobutton(text="項目2", variable=v, value=2, command=button_clicked) 13...

蛇足的考察:

もし(B)の代わりに
(C) 一旦選択したら他のボタンを非活性にする
(D) 選択済みのボタンを再度クリックしたら全てのボタンを再度活性化し全て未選択にする
という仕様に変えるなら

python

1import tkinter as tk 2 3 4def auto_reset(var, reset_value): 5 old = var.get() 6 7 def wrote(*args): 8 nonlocal old 9 cur = var.get() 10 if cur != reset_value and old == cur: 11 var.set(reset_value) 12 old = var.get() 13 14 var.trace_add('write', wrote) 15 16 17def main(): 18 root = tk.Tk() 19 root.geometry('350x300') 20 21 def button_clicked(): 22 print(f"selected button is {v.get()}") 23 for value, radio in enumerate(radios, 1): 24 state = 'active' if v.get() in (0, value) else 'disabled' 25 radio.configure(state=state) 26 27 def make_radio(value, text, x, y): 28 radio = tk.Radiobutton(text=text, variable=v, value=value, command=button_clicked) 29 radio.place(x=x, y=y) 30 return radio 31 32 v = tk.IntVar() 33 v.set(0) 34 auto_reset(v, 0) 35 36 radio_prms = ("項目1", 50, 160), ("項目2", 150, 160), ("項目3", 250, 160) 37 radios = [make_radio(value, *args) 38 for value, args in enumerate(radio_prms, 1)] 39 40 root.mainloop() 41 42 43if __name__ == '__main__': 44 main()

こんな感じにできそうです。変数の監視ができるはずと思いつつやってみたことがなかったのでtrace_addを使ってみました。それはともかく、このような振る舞いをするラジオボタンってあまり見かけない気がします。(B)の仕様の方が利用者をビックリさせずに済むのではないでしょうか。

投稿2019/04/13 13:51

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

goki_gottan

2019/04/14 02:52

おっしゃる通り、仕様Bがほしかったのです。ありがとうございます。 エクセルでもそうですが、ラジオボタン、オプションボタンはどちらか選択できれば良く、 変更も自由が理想です。さらに、選択ミスもあり、仕様Bがいいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問