回答編集履歴
5
追加分のコードに関する回答追記
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
ラジオボタンが複数選択される挙動についての再現コードを追記
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修正
test
CHANGED
@@ -11,5 +11,5 @@
|
|
11
11
|
追記: 質問に現在提示されているコードでは、冒頭に`import tkinter as tk` を挿入し実行したところ、
|
12
12
|
実行は正常にできて、answer は正常に戻し値になっていました。齟齬があるとすれば、
|
13
13
|
|
14
|
-
- `answer = ch` ⇒ もしかして `anwer = item
|
14
|
+
- `answer = ch` ⇒ もしかして `anwer = item[ch]` ch だと文字列ではなく、数値。
|
15
15
|
- コメントに掛かれているコード `print("answer : ", res)` 質問に提示のコードでは `Res = Selection()` Rが大文字
|
2
文章補足
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
コメント内容を確認し、追記。
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が大文字
|