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

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

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

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

Q&A

解決済

1回答

5706閲覧

親画面から子画面の表示イベントはできますが、子画面の閉じるイベントができない

yumekichi

総合スコア16

Python 3.x

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

0グッド

0クリップ

投稿2018/07/20 14:21

python 初心者です。
半年前から本やインターネットで勉強し断片的ですが
希望する動作を確認できるまでになったところです。

今度は断片的なソフトを集めて総合アプリを考えており、主メニュー画面から
各ソフトを起動してみたいと考えGUIで、wxpython を勉強中ですが問題にぶつかりました。

【発生している問題】
A画面で数字を入力するのに、付箋画面Bを立ち上げ内容を確認できるようにしたいのですが

A画面から B画面 立ち上げるイベント処理 はうまくいきますが
A画面から B画面を閉じるイベント処理ができません。

    *・B画面のパラメータからは閉じることができます。
*・A画面を閉じるとB画面も閉じます。

【 該当のソースコードをテスト版で作りました】

#!/usr/bin/env python
#-- 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.Close(True) #ここでは子の画面は閉じる

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)

def showChild(self,event): childFrame = ChildFrame(self) childID = childFrame.Show() #子の画面が開く return True def exit(self,event ): childFrame = ChildFrame(self) childFrame.Close(True) #子の画面が閉じない、エラーコメントもない

if name == 'main':
app = wx.PySimpleApp()
frame = MyWindow(parent=None,id=-1)
frame.Show()
app.MainLoop()

本当はB画面ソフトはモジュール化で別に置いておきたいですが、まだそのレベルでないようです。
できればモジュール化の場合には注意する点が有ればご指導お願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

◇原因
MyWindowクラスの以下の処理は今開いている子画面とは別の新しい子の画面が作られるためです。

Python

1 def exit(self, event ): 2 #今開いている子画面以外に新しく子画面を作る 3 childFrame = ChildFrame(self) 4 # 上記で作った子画面を閉じる 5 childFrame.Close(True) 6 # ※CloseではなくShowを試してみてください。子画面が2個開くのが確認できるかと 7 # 同じ位置に子画面が重なっているのでウィンドウを少しずらしてみてくださいな。 8 #childFrame.Show()

◇解決方法
親子関係がある画面で親から子をどうしても閉じたい場合は
親の初期処理で子画面を作成して子画面の表示/非表示を切り替える形が良いと思います。

Python

1# -*- coding: utf-8 -*- 2import wx 3 4class ChildFrame(wx.Frame): 5 def __init__(self,parent): 6 wx.Frame.__init__(self,parent,wx.ID_ANY,"child frame",pos=(100,100)) 7 8 pane2 = wx.Panel(self) 9 self.exitBtn = wx.Button(pane2,label="閉じる",pos=(100,10)) 10 self.Bind(wx.EVT_BUTTON,self.exit2,self.exitBtn) 11 12 def exit2(self,event): 13 # 画面を閉じるではなく非表示に 14 self.Show(False) 15 16class MyWindow(wx.Frame): 17 18 def __init__(self, parent, id): 19 wx.Frame.__init__(self,parent,wx.ID_ANY,"main frame") 20 panel = wx.Panel(self) 21 self.showChildBtn = wx.Button(panel,label="show child",pos=(10,10)) 22 self.exitBtn = wx.Button(panel,label="exit",pos=(100,10)) 23 self.Bind(wx.EVT_BUTTON,self.showChild,self.showChildBtn) 24 self.Bind(wx.EVT_BUTTON,self.exit,self.exitBtn) 25 # 子画面を生成する 26 self.childFrame = ChildFrame(self) 27 28 def showChild(self,event): 29 self.childFrame.Show() 30 return True 31 32 def exit(self, event): 33 self.childFrame.exit2(None) 34 35 36if __name__ == '__main__': 37 app = wx.PySimpleApp() 38 frame = MyWindow(parent=None,id=-1) 39 frame.Show() 40 app.MainLoop() 41

◇モジュール化の注意点
実際の家を建てる時、内装も大事ですが基礎工事(土台)も大事ですよね。
モジュールはアプリケーションを構成するための土台です。よって同じような事が言えます。
基礎設計が大事。

大枠でもいいので、紙やメモ帳などに親/子関係と相手に渡す情報/相手から受け取る情報を記述されるのをお勧め致します。

1,モジュールレベルの単体テストを行う。
if __name__ == '__main__':を使ってそのモジュール単体でテストできるようにした方がいいと思います。

2,重要な処理/内容ははログ情報をできるだけ残す。

logging — Python 用ロギング機能が使えます

3,モジュール間の階層構造を意識して作成する。


◇最後に質問文のコードの書き方について
Pythonはインデントが重要な言語です。
ソースコードをそのまま転記するとインデント情報が消えてしまいます。
以下の画像を参考に質問文のコードは記載してくださいな。
コードの書き方

投稿2018/07/22 09:39

編集2018/07/22 09:43
umyu

総合スコア5846

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

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

yumekichi

2018/07/22 10:10

回答有難うございます。 正直3~4日悩んでネットを調べていましたが適切な回答がなく 壁にぶち当たっていたところでした。 もう少し基本を勉強しないといけないようですね。反省します。 Tagインデントの件、送信した後気づきました。今後注意します。 今後もよろしくお願いします。
umyu

2018/07/22 10:16

>yumekichiさんへ 解決してよかったです。 こういう事象はネットのサンプルコードでは考慮されていないことが多いので、ハマりやすいポイントでしょうか。どちらかというとteratailとかの過去質問を検索するとヒットしやすいかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問