回答編集履歴
4
補足
test
CHANGED
@@ -32,27 +32,39 @@
|
|
32
32
|
|
33
33
|
これは`スタックトレース`といい実行時エラーが発生した時点でのプログラムの呼び出しツリー情報を表示しています。
|
34
34
|
|
35
|
+
|
36
|
+
|
35
|
-
今回の場合
|
37
|
+
今回の場合、ソースコードの`frame = F(container, self)`この行でエラーが発生した事を表しています。
|
36
38
|
|
37
39
|
`Widget.__init__(self, master, 'frame', cnf, {}, extra)`
|
38
40
|
|
39
41
|
は`Widget.__init__`関数はコンストラクタ(※1)クラスの初期化時にエラーが発生した事を表しています。
|
40
42
|
|
43
|
+
※1 正確には違いますが便宜上このように表記します。
|
41
44
|
|
42
45
|
|
43
46
|
|
47
|
+
質問文のプログラムは`StartPage`、`InputNamePage`、`OptionSelectPage`の3つのクラスの生成を行っているので、どのクラスでエラーが発生したのかを特定します。
|
44
48
|
|
45
|
-
質問文のプログラムは3つの生成処理を`StartPage`、`InputNamePage`、`OptionSelectPage`の3つのクラスの生成を行っているので、まず、どのクラスでエラーが発生したのかを特定します。
|
46
|
-
|
47
|
-
それは `WordPracticeApp#__init__`関数の
|
49
|
+
それは `WordPracticeApp#__init__`関数の`pages` 変数の各値をコメントアウトして実行すれば分かります。
|
48
50
|
|
49
51
|
|
50
52
|
|
51
|
-
コメントアウトして実行すると、`InputNamePage`と`OptionSelectPage`の2つのクラスの生成
|
53
|
+
コメントアウトして実行すると、`InputNamePage`と`OptionSelectPage`の2つのクラスの生成処理で質問文のエラーが発生することが分かります。
|
52
54
|
|
53
55
|
|
54
56
|
|
57
|
+
ではクラスのどの部分まで正しく実行できているのかを確認するために、
|
58
|
+
|
59
|
+
`InputNamePageの__init__`関数にその行まで実行したかどうかを確認するprint文を追加します。
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
そうすると、追加したprint文が表示されない事から「`__init__`関数が呼び出されていない」事が分かります。
|
64
|
+
|
65
|
+
|
66
|
+
|
55
|
-
では一体2つのクラスのどこが問題なのかそれはこの関数定義です。
|
67
|
+
では一体2つのクラスのどこが問題なのかそれはこの`__init__`の関数定義です。
|
56
68
|
|
57
69
|
先頭のアンダーラインが1個抜けています。
|
58
70
|
|
@@ -74,29 +86,47 @@
|
|
74
86
|
|
75
87
|
|
76
88
|
|
77
|
-
|
89
|
+
■長くなったので結論
|
78
90
|
|
79
|
-
|
91
|
+
- 原因
|
80
92
|
|
81
|
-
|
93
|
+
`__init__`関数のスペルミスにより`tk.Frame.__init__(self, parent)`の呼び出しが行われず質問文表記のエラーが発生した。
|
94
|
+
|
95
|
+
- 対策方法
|
96
|
+
|
97
|
+
スペルミスを治す。
|
82
98
|
|
83
99
|
|
84
100
|
|
85
|
-
|
101
|
+
このスペルミス以外にも2点スペルミスがあります。
|
102
|
+
|
103
|
+
1,`StartPage`クラスの`__init__`関数の引数`contoroller` → `controller`
|
104
|
+
|
105
|
+
2,質問文のソースコード最終行の`app.mainloop()` → `application.mainloop()`
|
86
106
|
|
87
107
|
|
88
108
|
|
89
|
-
|
109
|
+
よって合計4箇所のスペルミスがあります。
|
90
|
-
|
91
|
-
IDEを導入しているなら赤文字でエラーメッセージがでます。
|
92
110
|
|
93
111
|
|
94
112
|
|
95
|
-
|
113
|
+
プログラムを修正した時は、似たような問題を発生させないために修正すると共に1個以上のこの問題が発生しないための何かをしてください。
|
96
114
|
|
97
115
|
|
98
116
|
|
117
|
+
今回、私がオススメするのはIDEの導入の検討とSoftware Debugging Class Onlineについてです。
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
[IDE](https://ja.wikipedia.org/wiki/%E7%B5%B1%E5%90%88%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83)を使っていないなら導入の検討をしてくださいな。
|
122
|
+
|
99
|
-
|
123
|
+
IDEを導入しているなら赤文字で警告のメッセージがでます。
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
IDEはPython言語なら[PyCharm Community Edition](https://www.jetbrains.com/pycharm/download/)がおすすめです。
|
128
|
+
|
129
|
+
|
100
130
|
|
101
131
|
科学的なデバック方法については
|
102
132
|
|
3
追記
test
CHANGED
File without changes
|
2
追記
test
CHANGED
File without changes
|
1
追記
test
CHANGED
@@ -30,29 +30,31 @@
|
|
30
30
|
|
31
31
|
|
32
32
|
|
33
|
-
これはスタックトレースといいます。
|
33
|
+
これは`スタックトレース`といい実行時エラーが発生した時点でのプログラムの呼び出しツリー情報を表示しています。
|
34
34
|
|
35
|
-
|
35
|
+
今回の場合では`frame = F(container, self)`ソースコードのこの行でエラーが発生した事を表しています。
|
36
36
|
|
37
|
-
Widget.__init__(self, master, 'frame', cnf, {}, extra)
|
37
|
+
`Widget.__init__(self, master, 'frame', cnf, {}, extra)`
|
38
38
|
|
39
|
-
はWidget.__init__関数はコンストラクタ(※1)クラスの初期化時にエラーが発生した事を表しています。
|
39
|
+
は`Widget.__init__`関数はコンストラクタ(※1)クラスの初期化時にエラーが発生した事を表しています。
|
40
40
|
|
41
41
|
|
42
42
|
|
43
43
|
|
44
44
|
|
45
|
-
質問文のプログラムは3つの生成処理をStartPage、InputNamePage、OptionSelectPageの3つのクラスの生成を行っているので、まず、どのクラスでエラーが発生したのかを特定します。
|
45
|
+
質問文のプログラムは3つの生成処理を`StartPage`、`InputNamePage`、`OptionSelectPage`の3つのクラスの生成を行っているので、まず、どのクラスでエラーが発生したのかを特定します。
|
46
46
|
|
47
|
-
それは WordPracticeApp#__init__関数ののpages 変数の各値をコメントアウトして実行すれば分かります。
|
47
|
+
それは `WordPracticeApp#__init__`関数のの`pages` 変数の各値をコメントアウトして実行すれば分かります。
|
48
48
|
|
49
49
|
|
50
50
|
|
51
|
-
コメントアウトして実行すると、InputNamePageとOptionSelectPageの2つのクラスの生成に置いてエラーが発生することが分かります。
|
51
|
+
コメントアウトして実行すると、`InputNamePage`と`OptionSelectPage`の2つのクラスの生成に置いてエラーが発生することが分かります。
|
52
52
|
|
53
53
|
|
54
54
|
|
55
|
-
では一体どこ
|
55
|
+
では一体2つのクラスのどこが問題なのかそれはこの関数定義です。
|
56
|
+
|
57
|
+
先頭のアンダーラインが1個抜けています。
|
56
58
|
|
57
59
|
|
58
60
|
|
@@ -74,13 +76,13 @@
|
|
74
76
|
|
75
77
|
このスペルミス以外にも2点スペルミスがあります。
|
76
78
|
|
77
|
-
1,StartPageの__init__関数のcontroller
|
79
|
+
1,`StartPage`クラスの__init__関数の引数controller
|
78
80
|
|
79
|
-
2,質問文のソースコード最終行のapp.mainloop()これはapplication.mainloop()です。
|
81
|
+
2,質問文のソースコード最終行の`app.mainloop()`これは`application.mainloop()`です。
|
80
82
|
|
81
83
|
|
82
84
|
|
83
|
-
よって
|
85
|
+
よって質問文のプログラムは合計4箇所のスペルミスが発生しています。
|
84
86
|
|
85
87
|
|
86
88
|
|
@@ -99,3 +101,9 @@
|
|
99
101
|
科学的なデバック方法については
|
100
102
|
|
101
103
|
udacityの無料コースの[Software Debugging Class Online](https://www.udacity.com/course/software-debugging--cs259)が考え方として纏まっているのでかなりおすすめです。
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
■余談
|
108
|
+
|
109
|
+
質問文は追記する形にしてくださいな。
|