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

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

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

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

Tkinter

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

Q&A

解決済

2回答

10793閲覧

エラー文の読み方が分からない、また、文法がどう間違っているのか、ご教授いただきたい。

threeeverytwo

総合スコア49

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2018/03/07 18:59

編集2018/03/08 08:56

前提・実現したいこと

文法ミスがなぜ起こっているのか理解したい。

###参考サイト
https://pythonprogramming.net/change-show-new-frame-tkinter/

発生している問題・エラーメッセージ

frame = F(container, self) ← このコードにエラー文がでるのだが、間違っている理由が、分からない。

該当のソースコード

python

1# -*- coding: utf-8 -*- 2 3#========================================================================= 4# ライブラリ 5#========================================================================= 6# GUIを扱う 7import tkinter as tk 8# tkinterよりデザインが良くなる 9from tkinter import ttk 10 11#========================================================================= 12# クラス定義 13#========================================================================= 14#------------------------------------------------------------------------- 15# メインクラス (継承 : tk.Tk) 16#------------------------------------------------------------------------- 17class WordPracticeApp(tk.Tk): 18 19 #--- コンストラクタ 20 def __init__(self, *args, **kwargs): 21 22 # 初期化 23 tk.Tk.__init__(self, *args, **kwargs) 24 25 # コンテナのフレームを生成 26 container = tk.Frame(self) 27 28 # コンテナ配置 29 container.pack(side="top", fill="both", expand=True) 30 31 # コンテナのグリッドを 1x1 にする 32 container.grid_rowconfigure(0, weight=1) 33 container.grid_columnconfigure(0, weight=1) 34 35 # フレームを格納する配列 36 self.frames = {} 37 38 # ページを格納する配列 39 pages = ( 40 StartPage, 41 InputNamePage, 42 OptionSelectPage 43 ) 44 45 # それぞれのページに対して 46 for F in pages: 47 # フレームを生成 48 frame = F(container, self) 49 50 # フレームを格納 51 self.frames[F] = frame 52 53 # フレームを配置 54 frame.grid(row=0, column=0, sticky="nsew") 55 56 57 # スタートページを表示 58 self.show_frame(StartPage) 59 60 61 #--- フレームを表示 62 def show_frame(self, cont): 63 64 # WordPracticeAppのcontのフレームを格納 65 frame = self.frames[cont] 66 67 # そのフレームを上位層へ 68 frame.tkraise() 69 70 71#------------------------------------------------------------------------- 72# スタートページクラス (継承 : tk.Frame) 73#------------------------------------------------------------------------- 74class StartPage(tk.Frame): 75 76 #--- コンストラクタ 77 def __init__(self, parent, contoroller): 78 79 # 初期化 80 tk.Frame.__init__(self, parent) 81 82 ### タイトル表示 83 #--- ラベル生成 84 # 空白 85 spaceLabel1 = [tk.Label(self, text="") for column in range(10)] 86 spaceLabel2 = [tk.Label(self, text="") for column in range(3)] 87 # タイトル 88 titleLabelFont = ("Helevetice", 32, "bold") 89 titleLabel = ttk.Label(self,\ 90 text="WORDPRACTICE",\ 91 font=titleLabelFont) 92 93 #--- ラベル配置 94 # 空白 95 for index in range(10): 96 spaceLabel1[index].pack() 97 # タイトル 98 titleLabel.pack() 99 100 ### ボタン表示 101 #--- ボタン生成 102 startButton =\ 103 ttk.Button( self, text=" Start ",\ 104 command=lambda : controller.show_frame(InputNamePage) ) 105 106 #--- ボタン配置 107 # 空白 108 for index in range(3): 109 spaceLabel2[index].pack() 110 # ボタン 111 startButton.pack() 112 113 114 115#------------------------------------------------------------------------- 116# 名前入力ページクラス (継承 : tk.Frame) 117#------------------------------------------------------------------------- 118class InputNamePage(tk.Frame): 119 120 #--- コンストラクタ 121 def _init__(self, parent, controller): 122 123 # 初期化 124 tk.Frame.__init__(self, parent) 125 126 ### タイトル表示 127 #--- ラベル生成 128 # 空白 129 spaceLabel1 = [tk.Label(self, text="") for column in range(5)] 130 # タイトル 131 titleLabelFont = ("Helevetice", 18) 132 titleLabel =\ 133 ttk.Label(self,\ 134 text="ユーザー名を入力してください。",\ 135 font=titleLabelFont) 136 137 #--- ラベル配置 138 # 空白 139 for index in range(5): 140 spaceLabel1[index].pack() 141 # タイトル 142 titleLabel.pack() 143 144 145 ### フレーム表示 146 #--- フレーム生成 147 frame = ttk.Frame(self) 148 #--- フレーム配置 149 frame.pack() 150 151 152 ### ユーザー名入力表示 153 #--- ラベル生成 154 # 空白 155 spaceLabel2 = [tk.Label(frame, text="") for column in range(3)] 156 157 # ユーザー名 158 userNameLabelFont = ("Helevetice", 14) 159 userNameLabel =\ 160 ttk.Label(frame, text="ユーザー名:", font=userNameLabelFont) 161 162 #--- ラベル配置 163 # 空白 164 for index in range(3): 165 spaceLabel2[index].grid(row=index, column=0) 166 # ユーザー名 167 userNameLabel.grid(row=4, column=0) 168 169 #--- エントリー生成 170 userName = tk.StringVar() 171 userNameEntry = ttk.Entry(frame, textvariable=userName, width=30) 172 173 #--- エントリー配置 174 userNameEntry.grid(row=4, column=1) 175 176 177 ### ボタン表示 178 #--- ボタン生成 179 okButton = ttk.Button( frame, text=" OK ",\ 180 command=lambda :\ 181 controller.show_frame(OptionSelectPage) ) 182 183 #--- ボタン配置 184 okButton.grid(row=4, column=3) 185 186 187#------------------------------------------------------------------------- 188# 問題形式選択ページクラス (継承 : tk.Frame) 189#------------------------------------------------------------------------- 190class OptionSelectPage(tk.Frame): 191 192 #--- コンストラクタ 193 def _init__(self, parent, controller): 194 195 # 初期化 196 tk.Frame.__init__(self, parent) 197 198 ### タイトル表示 199 #--- ラベル生成 200 # 空白 201 spaceLabel1 = [tk.Label(self, text="") for column in range(5)] 202 # タイトル 203 titleLabelFont = ("Helevetice", 18) 204 titleLabel =\ 205 ttk.Label(self,\ 206 text="問題形式を選択してください。",\ 207 font=titleLabelFont) 208 209 #--- ラベル配置 210 # 空白 211 for index in range(5): 212 spaceLabel1[index].pack() 213 # タイトル 214 titleLabel.pack() 215 216 217 218#========================================================================= 219# 本体処理 220#========================================================================= 221application = WordPracticeApp() 222app.mainloop() 223

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/03/08 00:49

エラーのスタックとレースは残しておいてください。
guest

回答2

0

ベストアンサー

エラー文の読み方ですが。

txt

1Traceback (most recent call last): 2 File "Window_ver1.1.py", line 210, in <module> 3 application = WordPracticeApp() 4 File "Window_ver1.1.py", line 48, in __init__ 5 frame = F(container, self) 6 File "C:\Users\kaiji\Anaconda3\lib\tkinter\__init__.py", line 2738, in __init__ 7 Widget.__init__(self, master, 'frame', cnf, {}, extra) 8 File "C:\Users\kaiji\Anaconda3\lib\tkinter\__init__.py", line 2293, in __init__ 9 (widgetName, self._w) + extra + self._options(cnf)) 10_tkinter.TclError: unknown option "-menu" 11

これはスタックトレースといい実行時エラーが発生した時点でのプログラムの呼び出しツリー情報を表示しています。

今回の場合、ソースコードのframe = F(container, self)この行でエラーが発生した事を表しています。
Widget.__init__(self, master, 'frame', cnf, {}, extra)
Widget.__init__関数はコンストラクタ(※1)クラスの初期化時にエラーが発生した事を表しています。
※1 正確には違いますが便宜上このように表記します。

質問文のプログラムはStartPageInputNamePageOptionSelectPageの3つのクラスの生成を行っているので、どのクラスでエラーが発生したのかを特定します。
それは WordPracticeApp#__init__関数のpages 変数の各値をコメントアウトして実行すれば分かります。

コメントアウトして実行すると、InputNamePageOptionSelectPageの2つのクラスの生成処理で質問文のエラーが発生することが分かります。

ではクラスのどの部分まで正しく実行できているのかを確認するために、
InputNamePageの__init__関数にその行まで実行したかどうかを確認するprint文を追加します。

そうすると、追加したprint文が表示されない事から「__init__関数が呼び出されていない」事が分かります。

では一体2つのクラスのどこが問題なのかそれはこの__init__の関数定義です。
先頭のアンダーラインが1個抜けています。

txt

1def _init__(self, parent, controller):

txt

1def __init__(self, parent, controller):

■長くなったので結論

  • 原因

__init__関数のスペルミスによりtk.Frame.__init__(self, parent)の呼び出しが行われず質問文表記のエラーが発生した。

  • 対策方法

スペルミスを治す。

このスペルミス以外にも2点スペルミスがあります。
1,StartPageクラスの__init__関数の引数contorollercontroller
2,質問文のソースコード最終行のapp.mainloop()application.mainloop()

よって合計4箇所のスペルミスがあります。

プログラムを修正した時は、似たような問題を発生させないために修正すると共に1個以上のこの問題が発生しないための何かをしてください。

今回、私がオススメするのはIDEの導入の検討とSoftware Debugging Class Onlineについてです。

IDEを使っていないなら導入の検討をしてくださいな。
IDEを導入しているなら赤文字で警告のメッセージがでます。

IDEはPython言語ならPyCharm Community Editionがおすすめです。

科学的なデバック方法については
udacityの無料コースのSoftware Debugging Class Onlineが考え方として纏まっているのでかなりおすすめです。

■余談
質問文は追記する形にしてくださいな。

投稿2018/03/07 23:45

編集2018/03/08 07:11
umyu

総合スコア5846

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

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

threeeverytwo

2018/03/08 09:15

一つのミスだけでなく、他のミスまで発見いただいて、本当にありがとうございました。 今後このようなミスをしないように、IDEを導入させていただき、ミスを防ぎたいと思います。ご回答ありがとうございました。 余談についても、次から気を付けたいと思います。
umyu

2018/03/08 09:51

プログラムを始めたばかりの時は分からない事が多いと思いますが。1個ずつ学習していけば少しずつ上達します。 私的なお勧めは回答文にあげたようにudacityの無料コースのSoftware Debugging Class Onlineです。 プログラムを始めた頃にこのコースの内容について知っていたら防げたバグが大量にあります。
guest

0

most recent call last

最後の行が最後に呼ばれました

unknown option "-menu"

「-menu」というオプションは知りません

###追記
最初は「エラーの意味がわからない」という質問でした。
何も言及なくこっそり質問編集されるとまるで私が頓珍漢な回答をしているように見えます。

またエラー文を消す意味が分かりません。
新しい質問文では文法エラーとなっていますが、ソース中に「-menu」という記述はありません。

投稿2018/03/07 21:27

編集2018/03/07 22:33
Zuishin

総合スコア28669

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

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

threeeverytwo

2018/03/08 09:09

申し訳ございません、この質問を第三者が見ることを前提に考えることが出来ていませんでした。 以後、質問内容を変更するときは、追記の形を取りたいと思います。 また、エラー文を削除したのは、変更後の質問内容には、必要ないと考えてしまったからです。 これからは、第三者の目に気を付けて、質問したいと思います。 長文失礼いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問