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

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

新規登録して質問してみよう
ただいま回答率
85.48%
ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

Q&A

解決済

1回答

881閲覧

python tkinter radiobuttonの値取得について

yan8

総合スコア2

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

0グッド

0クリップ

投稿2021/05/25 14:33

前提・実現したいこと

ラジオボタンを設定し、選択した値を取得しようとしていますが、最初に設定した値になってしまいます。
初心者ですので、優しく教えていただけるとありがたく存じます。
ネット情報など中心に調べたのですが、どうも理解が及ばず・・

書き込み途中で自己解決しました?がなぜそうなったかが理解できていないので、詳しい方ご教授いただけましたら幸いです。

該当のソースコード

import tkinter as tk
from tkinter import Label, Radiobutton, Variable, messagebox

root = tk.Tk()

root.withdraw()

messagebox.showinfo("メッセージ","〇〇")

root = tk.Tk()
root.title("ふるさとシステム_メインメニュー")
root.geometry("50x600+0+0")

frame = ttk.Frame(root)
frame.pack(fill=tk.BOTH,padx=5,pady=2)

Label(root,text="ログインIDを選択").pack(padx=5,pady=2)

var = tk.IntVar()
var.set(False)

rdo1 = tk.Radiobutton(root,text=dfradio.iat[0,0],value=0,variable=var)
rdo1.pack(padx=5, pady=2)

rdo2 = tk.Radiobutton(root,text=dfradio.iat[1,0],value=1,variable=var)
rdo2.pack(padx=5, pady=2)

rdo3 = tk.Radiobutton(root,text=dfradio.iat[2,0],value=2,variable=var)
rdo3.pack(padx=5, pady=2)

def kensaku():
global chvar
chvar = var.get()
print(chvar)
.....

試したこと

ラジオボタンで選んだ数値ではなく、var.set()のところに設定した数値がvar.get()で取得されておりました。

補足情報(FW/ツールのバージョンなど)

#のメッセージボックス部分のコメント外すとvar.set()の値が、コメントにするとラジオボタンで選択した値が取得できるようになりました。

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題点: tk.Tk() を複数回呼んでいる為
解決策: tk.Tk() は、tkinter の初期化処理の為、プログラム中で1度のみにする。


詳細

tkinter モジュールの実装は、

  • tk.Tk() 呼び出し時に、tkinter モジュール内のグローバル変数に root を設定
  • tkinter のクラスは、親(第一引数、master引数) が指定されていない場合、

 デフォルトの root オブジェクトを親に設定します。

python

1import tkinter as tk 2 3root1 = tk.Tk() 4root2 = tk.Tk() 5var = tk.IntVar() # 省略時の親は root1 6 7for num in range(3): 8 button = tk.Radiobutton(root2, text=f"item {num}", value=num, variable=var) 9 button.pack() 10 11root2.mainloop() 12

IntVar等の tkinter の提供する変数オブジェクトは、
root オブジェクト毎に設定されますが、所属が異なる場合は、無効な指定になります。

因みにエラー等はでません。問題を再現するコード
Variableオブジェクトを作らずにvariable に適当な値を設定すると、
無効な変数を設定した時の挙動が確認できます。

python

1import tkinter as tk 2 3root = tk.Tk() 4var = "XXX" # 適当な文字列 5 6for num in range(3): 7 button = tk.Radiobutton(root, text=f"item {num}", value=num, variable=var) 8 button.pack() 9 10root.mainloop()

以下は問題を実証するためのコード、推奨の解決策ではありません。

デフォルトの root もリセットする回避方法。

python

1import tkinter as tk 2 3root1 = tk.Tk() 4root1.destroy() # デフォルトのrootをリセット 5 6root2 = tk.Tk() # デフォルトのroot に再設定される 7var = tk.IntVar() # 省略時の親は root2 8 9for num in range(3): 10 button = tk.Radiobutton(root2, text=f"item {num}", value=num, variable=var) 11 button.pack() 12 13root2.mainloop()

明示的に親を指定する回避方法。

python

1import tkinter as tk 2 3# tkinter 側でデフォルトのroot を設定しなくなります。 4tk.NoDefaultRoot() 5 6root1 = tk.Tk() 7 8root2 = tk.Tk() 9var = tk.IntVar(master=root2) # 親を明示的に設定する 10 11for num in range(3): 12 button = tk.Radiobutton(root2, text=f"item {num}", value=num, variable=var) 13 button.pack() 14 15root2.mainloop()

これらの非推奨の回避策は、他に同種の問題も起こりやすくなる為、、
通常の利用では、tk.Tk() は一度のみにする解決策をお勧めします。
(補足: ウィンドウを複数作りたい場合、2つ目以降は tk.Toplevel を用います)

投稿2021/05/25 22:46

編集2021/05/25 22:47
teamikl

総合スコア8664

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

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

yan8

2021/05/26 11:33

分かりやすい説明、有難うございました!出来たらまたよろしくお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問