回答編集履歴

5

追加分のコードに関する回答追記

2024/07/18 05:22

投稿

teamikl
teamikl

スコア8681

test CHANGED
@@ -37,3 +37,30 @@
37
37
 
38
38
  - `answer = ch` ⇒ もしかして `anwer = item[ch]` ch だと文字列ではなく、数値。
39
39
  - コメントに掛かれているコード `print("answer : ", res)` 質問に提示のコードでは `Res = Selection()` Rが大文字
40
+
41
+ ----
42
+ 追加分のコードに関する回答追記
43
+
44
+ 問題点は、複数の tkinter.Tk を生成している点 & インスタンス生成時に親を省略している点
45
+
46
+ 説明補足すると
47
+ - tkinter.Tk() は、イベントループと メインのウィンドウ(Toplevel) を持つ。
48
+ - tkinter.Toplevel() は、ウィンドウのみ。
49
+ - ウィジェットやIntVar 等のインスタンスを作成する際に、
50
+ 引数を省略すると、デフォルトの root (一番最初に生成した tkinter.Tk) が親となる。
51
+
52
+ ラジオボタンは2つ目の root で使われているが、intVar は最初の root の所属となっているため
53
+ (原因は関数スコープとGC ではありませんでいたが)
54
+ 無効な IntVar を指定してる点が、ラジオボタンのおかしな挙動の原因です。
55
+
56
+ 暫定的な回避策は、IntVar の親の明示的な指定
57
+
58
+ ```
59
+ val = tk.IntVar(root)
60
+ ```
61
+
62
+ 後々の事を考えると、
63
+ 「イベントループ」が複数という状況自体を避けた方が良いので、
64
+ プログラムの構造自体を root = tk.Tk() は一度で済むような構成を割と強くお勧めします。
65
+ 分量的に回答で示すことは難しいですが、方針として tkinter でのダイアログの作成方法等を調べてみてください。
66
+

4

ラジオボタンが複数選択される挙動についての再現コードを追記

2024/07/17 09:08

投稿

teamikl
teamikl

スコア8681

test CHANGED
@@ -8,6 +8,30 @@
8
8
 
9
9
 
10
10
  ----
11
+ 追記2: ラジオボタンが複数選択される挙動についての再現コード例
12
+ (戻り値の問題とは別)
13
+
14
+ ```python
15
+ import tkinter as tk
16
+
17
+ CHOICES = ["A", "B", "C", "D", "E"]
18
+ root = tk.Tk()
19
+
20
+ def create_widgets(parent, items):
21
+ # XXX:
22
+ # global val
23
+ val = tk.IntVar()
24
+
25
+ for idx, text in enumerate(items):
26
+ radio = tk.Radiobutton(parent, text=text, variable=val, value=idx)
27
+ radio.pack()
28
+
29
+ create_widgets(root, CHOICES)
30
+
31
+ root.mainloop()
32
+ ```
33
+
34
+ ----
11
35
  追記: 質問に現在提示されているコードでは、冒頭に`import tkinter as tk` を挿入し実行したところ、
12
36
  実行は正常にできて、answer は正常に戻し値になっていました。齟齬があるとすれば、
13
37
 

3

typo修正

2024/07/17 08:57

投稿

teamikl
teamikl

スコア8681

test CHANGED
@@ -11,5 +11,5 @@
11
11
  追記: 質問に現在提示されているコードでは、冒頭に`import tkinter as tk` を挿入し実行したところ、
12
12
  実行は正常にできて、answer は正常に戻し値になっていました。齟齬があるとすれば、
13
13
 
14
- - `answer = ch` ⇒ もしかして `anwer = items[ch]` ch だと文字列ではなく、数値。
14
+ - `answer = ch` ⇒ もしかして `anwer = item[ch]` ch だと文字列ではなく、数値。
15
15
  - コメントに掛かれているコード `print("answer : ", res)` 質問に提示のコードでは `Res = Selection()` Rが大文字

2

文章補足

2024/07/17 08:56

投稿

teamikl
teamikl

スコア8681

test CHANGED
@@ -9,7 +9,7 @@
9
9
 
10
10
  ----
11
11
  追記: 質問に現在提示されているコードでは、冒頭に`import tkinter as tk` を挿入し実行したところ、
12
- answer は正常に戻し値になっていました。齟齬があるとすれば、
12
+ 実行は正常にできて、answer は正常に戻し値になっていました。齟齬があるとすれば、
13
13
 
14
14
  - `answer = ch` ⇒ もしかして `anwer = items[ch]` ch だと文字列ではなく、数値。
15
15
  - コメントに掛かれているコード `print("answer : ", res)` 質問に提示のコードでは `Res = Selection()` Rが大文字

1

コメント内容を確認し、追記。

2024/07/17 08:55

投稿

teamikl
teamikl

スコア8681

test CHANGED
@@ -5,3 +5,11 @@
5
5
 
6
6
  暫定的な回避策: IntVar インスタンスを格納する変数 val を global 変数にしておく。
7
7
  ⇒ global スコープに置く、global 宣言する、等。
8
+
9
+
10
+ ----
11
+ 追記: 質問に現在提示されているコードでは、冒頭に`import tkinter as tk` を挿入し実行したところ、
12
+ answer は正常に戻し値になっていました。齟齬があるとすれば、
13
+
14
+ - `answer = ch` ⇒ もしかして `anwer = items[ch]` ch だと文字列ではなく、数値。
15
+ - コメントに掛かれているコード `print("answer : ", res)` 質問に提示のコードでは `Res = Selection()` Rが大文字