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

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

ただいまの
回答率

90.47%

  • Python 3.x

    10255questions

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

  • Tkinter

    282questions

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

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

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 134

tomo1998

score 21

 前提・実現したいこと

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

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

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

import tkinter as tk

class Name(tk.Frame):
    def __init__(self):
        #初期化
        self.Title_GUI()


    def Title_GUI(self):
        #タイトル画面では、どの測定をするか選択することができる
        self.root=tk.Tk()
        Button001=tk.Button(self.root,text="測定01",command=self.Call_Test001_GUI)
        Button001.pack()
        Button002=tk.Button(self.root,text="測定02",command=self.Call_Test002_GUI)
        Button002.pack()
        self.root.mainloop()

    def Call_Test001_GUI(self):
        self.root.destroy()
        self.Test001_GUI()

    def Call_Test002_GUI(self):
        self.root.destroy()
        self.Test002_GUI()

    def Call_Title_GUI(self):
        self.root.destroy()
        self.Title_GUI()

    def Test001_GUI(self):
        self.root=tk.Tk()
        Button011=tk.Button(self.root,text="タイトルに戻る",command=self.Call_Title_GUI)
        Button011.pack()
        #以下測定01の表示内容
        #.....
        self.root.mainloop()

    def Test002_GUI(self):
        self.root=tk.Tk()
        Button021=tk.Button(self.root,text="タイトルに戻る",command=self.Call_Title_GUI)
        Button021.pack()
        #以下測定02の表示内容
        #.....
        self.root.mainloop()

Name()

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

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

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

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

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

タイトル用コード

import tkinter as tk
import Module003 as M3

root=tk.Tk()
M3.GUI()
root.mainloop()

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

import tkinter as tk

def Call_Mess_GUI():
    root.destroy()
    #Mess_GUI()

def GUI():
    Text001=tk.Label(text="測定に関する詳細説明をここに表示")
    Text001.pack()
    button001=tk.Button(text="この測定方法を行う",command=Call_Mess_GUI)
    button001.pack()

def Mess_GUI():
    pass


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

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

 試したこと

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

協力お願いします!

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    10255questions

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

  • Tkinter

    282questions

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