質問: MyWindow(parent=None,id=-1) frame.Show() app.MainLoop() 本当はB画面ソフトはモジュール化で別に置いておきたいですが、まだそのレベルでないようです。 できればモジュール化の場合には注意する点が有ればご指導お願いします。
回答: ◇原因 `MyWindow`クラスの以下の処理は**今開いている子画面**とは別の新しい子の画面が作られるためです。 ``` def exit(self, event ): #今開いている子画面以外に新しく子画面を作る childFrame = ChildFrame(self) # 上記で作った子画面を閉じる childFrame.Close(True) # ※CloseではなくShowを試してみてください。子画面が2個開くのが確認できるかと # 同じ位置に子画面が重なっているのでウィンドウを少しずらしてみてくださいな。 #childFrame.Show() ``` ◇解決方法 親子関係がある画面で親から子をどうしても閉じたい場合は 親の初期処理で子画面を作成して子画面の表示/非表示を切り替える形が良いと思います。 ``` # -*- coding: utf-8 -*- import wx class ChildFrame(wx.Frame): def __init__(self,parent): wx.Frame.__init__(self,parent,wx.ID_ANY,"child frame",pos=(100,100)) pane2 = wx.Panel(self) self.exitBtn = wx.Button(pane2,label="閉じる",pos=(100,10)) self.Bind(wx.EVT_BUTTON,self.exit2,self.exitBtn) def exit2(self,event): # 画面を閉じるではなく非表示に self.Show(False) class MyWindow(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self,parent,wx.ID_ANY,"main frame") panel = wx.Panel(self) self.showChildBtn = wx.Button(panel,label="show child",pos=(10,10)) self.exitBtn = wx.Button(panel,label="exit",pos=(100,10)) self.Bind(wx.EVT_BUTTON,self.showChild,self.showChildBtn) self.Bind(wx.EVT_BUTTON,self.exit,self.exitBtn) # 子画面を生成する self.childFrame = ChildFrame(self) def showChild(self,event): self.childFrame.Show() return True def exit(self, event): self.childFrame.exit2(None) if __name__ == '__main__': app = wx.PySimpleApp() frame = MyWindow(parent=None,id=-1) frame.Show() app.MainLoop() ``` ◇モジュール化の注意点 実際の家を建てる時、内装も大事ですが基礎工事(土台)も大事ですよね。 モジュールはアプリケーションを構成するための土台です。よって同じような事が言えます。 基礎設計が大事。 大枠でもいいので、紙やメモ帳などに親/子関係と相手に渡す情報/相手から受け取る情報を記述されるのをお勧め致します。 1,モジュールレベルの単体テストを行う。 `if __name__ == '__main__':`を使ってそのモジュール単体でテストできるようにした方がいいと思います。 2,重要な処理/内容ははログ情報をできるだけ残す。 logging — Python 用ロギング機能が使えます 3,モジュール間の階層構造を意識して作成する。 ◇最後に質問文のコードの書き方について Pythonはインデントが重要な言語です。 ソースコードをそのまま転記するとインデント情報が消えてしまいます。 以下の画像を参考に質問文のコードは記載してくださいな。 !コードの書き方