前提・実現したいこと
測定プログラムを作ったのですが、今後赤の他人がプログラムを編集しやすくするためにプログラムをモジュール化する必要があるのですがそこで問題が起こっています
まず画面表示をする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()
それで、モジュール化したらこんな感じにしたいのですが・・・
実行すると以下のように
つまり、モジュールをインポートしたら、まずモジュール達が各自の測定方法に関する詳細とそれを実行するボタンをタイトル画面で表示し、そのボタンを押したらモジュール内にある測定画面を呼び出す、といった感じにしたいです
もっと簡単に言えば、例えば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)
なんて書いてみたりしてみましたが、やっぱりだめでした・・・
協力お願いします!
あなたの回答
tips
プレビュー