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

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

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

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

Tkinter

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

Q&A

0回答

1034閲覧

インポートされた複数の画面表示モジュール画面へ表示を切り替えたい

tomo1998

総合スコア34

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2018/11/12 11:51

前提・実現したいこと

測定プログラムを作ったのですが、今後赤の他人がプログラムを編集しやすくするためにプログラムをモジュール化する必要があるのですがそこで問題が起こっています

まず画面表示をするGUIモジュールを複数読み込んで表示、かつそれぞれの画面を行き行きできるプログラムを作成したいのですが、どうもうまくいきません

例えば、すべての内容が1つのプログラムに入ったコードなら、以下のようなコードになりますが・・・

python3

1import tkinter as tk 2 3class Name(tk.Frame): 4 def __init__(self): 5 #初期化 6 self.Title_GUI() 7 8 9 def Title_GUI(self): 10 #タイトル画面では、どの測定をするか選択することができる 11 self.root=tk.Tk() 12 Button001=tk.Button(self.root,text="測定01",command=self.Call_Test001_GUI) 13 Button001.pack() 14 Button002=tk.Button(self.root,text="測定02",command=self.Call_Test002_GUI) 15 Button002.pack() 16 self.root.mainloop() 17 18 def Call_Test001_GUI(self): 19 self.root.destroy() 20 self.Test001_GUI() 21 22 def Call_Test002_GUI(self): 23 self.root.destroy() 24 self.Test002_GUI() 25 26 def Call_Title_GUI(self): 27 self.root.destroy() 28 self.Title_GUI() 29 30 def Test001_GUI(self): 31 self.root=tk.Tk() 32 Button011=tk.Button(self.root,text="タイトルに戻る",command=self.Call_Title_GUI) 33 Button011.pack() 34 #以下測定01の表示内容 35 #..... 36 self.root.mainloop() 37 38 def Test002_GUI(self): 39 self.root=tk.Tk() 40 Button021=tk.Button(self.root,text="タイトルに戻る",command=self.Call_Title_GUI) 41 Button021.pack() 42 #以下測定02の表示内容 43 #..... 44 self.root.mainloop() 45 46Name()

図に表すと、こんな感じになりますね
図1

それで、モジュール化したらこんな感じにしたいのですが・・・
図2
実行すると以下のように
図3
つまり、モジュールをインポートしたら、まずモジュール達が各自の測定方法に関する詳細とそれを実行するボタンをタイトル画面で表示し、そのボタンを押したらモジュール内にある測定画面を呼び出す、といった感じにしたいです

もっと簡単に言えば、例えばDSとかでカセットを差し込んだらそのカセットゲームの詳細を表示する、そんな感じです

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

実際にテスト用の簡単なコードを組んでみたところ、画面切り替えで問題が起こってしまいました。

タイトル用コード

python3

1import tkinter as tk 2import Module003 as M3 3 4root=tk.Tk() 5M3.GUI() 6root.mainloop() 7

GUIモジュールコード 名前:Module003

python3

1import tkinter as tk 2 3def Call_Mess_GUI(): 4 root.destroy() 5 #Mess_GUI() 6 7def GUI(): 8 Text001=tk.Label(text="測定に関する詳細説明をここに表示") 9 Text001.pack() 10 button001=tk.Button(text="この測定方法を行う",command=Call_Mess_GUI) 11 button001.pack() 12 13def Mess_GUI(): 14 pass 15

タイトルのときでは問題なくGUIモジュールの内容を表示できているのですが、ボタンを押した瞬間に、以下のようなエラーメッセージが表示されます。

line 5, in Call_Mess_GUI
root.destroy()
NameError: global name 'root' is not defined

試したこと

タイトル側のプログラムにある、root情報がモジュール側に伝わっていないのではないかと思うのですが、ならモジュールにrootの情報を渡してみればいいのではないのかと思って、タイトル側のコードで
M3.GUI()をM3.GUI(root)
なんて書いてみたりしてみましたが、やっぱりだめでした・・・

協力お願いします!

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問