###前提・実現したいこと
Python初心者です。GUIとしてwxpythonを使っています。
親ウィンドウから子ウィンドウを呼び出して、子ウィンドウで選んだ結果(リストや日時データなどの値)を子ウィンドウにあるボタン一つで親ウィンドウにあるリストに表示または追加したいです。
##考えたこと
例えば、下記のようにすれば、親ウィンドウのボタンを押すなどのイベントを起こせば、子の値を受けて表示することはできました。
class Child_Project(): list1=[] def __init__(self, parent): (中略) def button1(self, event): Parent_Project.list1=self.list1 class Parent_Project(): list1=[] def __init__(self, parent): (中略) def button1(self, event): self.listbox.SetItems(self.list1)
しかし、私がしたいことは、わざわざ親ウィンドウでボタンを押さずとも子ウィンドウのボタンを押せば親ウィンドウのリスト(self.listbox)に表示させるようにしたいのです。
調べてみましたがよくわからず…行き詰ってしまいました。
似た質問でBindさせれば良い。というような回答があったのですが、Bindをどう使ってどう表示させるのか全く分からずでした。。もしBindを使うのが正解ということであれば、詳細に伺えれば大変幸いです。。
###実行用ソース
イメージとしては以下のようなものになります。
上記の考えてみたこと(親ウィンドウのボタンを押すなどのイベントを起こせば、子の値を受けて表示することはできました。)の部分についてはコメントアウトしています。
import wx class child_dialog(wx.Dialog): # list1 = [] def __init__(self, parent): wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition, size=wx.Size(200, 200), style=wx.DEFAULT_DIALOG_STYLE) self.SetSizeHints(wx.DefaultSize, wx.DefaultSize) bSizer2 = wx.BoxSizer(wx.VERTICAL) bSizer3 = wx.BoxSizer(wx.HORIZONTAL) bSizer4 = wx.BoxSizer(wx.HORIZONTAL) self.text1 = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0) bSizer3.Add(self.text1, 0, wx.ALL, 5) bSizer2.Add(bSizer3, 1, wx.EXPAND, 5) self.done_button = wx.Button(self, wx.ID_ANY, u"Done", wx.DefaultPosition, wx.DefaultSize, 0) bSizer4.Add(self.done_button, 0, wx.ALL, 5) self.cancel_button = wx.Button(self, wx.ID_ANY, u"Cancel", wx.DefaultPosition, wx.DefaultSize, 0) bSizer4.Add(self.cancel_button, 0, wx.ALL, 5) bSizer2.Add(bSizer4, 0, wx.ALIGN_RIGHT, 5) self.SetSizer(bSizer2) self.Layout() self.Centre(wx.BOTH) self.Show() # Connect Events self.done_button.Bind(wx.EVT_BUTTON, self.done) self.cancel_button.Bind(wx.EVT_BUTTON, self.cancel) def __del__(self): pass def done(self, event): # self.list1 = self.text1.GetValue() # parent_project.list1 = self.list1 parent_project.listbox.SetItems(self.list1) # エラーが出る場所。ここで親リストに表示させたい。 self.Destroy() self.Close() def cancel(self, event): self.Destroy() self.Close() class parent_project(wx.Frame): # list1 = [] def __init__(self, parent): wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition, size=wx.Size(300, 300), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL) self.SetSizeHints(wx.DefaultSize, wx.DefaultSize) bSizer1 = wx.BoxSizer(wx.VERTICAL) m_listBox1Choices = [] self.m_button1 = wx.Button(self, wx.ID_ANY, u"open dialog", wx.DefaultPosition, wx.DefaultSize, 0) bSizer1.Add(self.m_button1, 0, wx.ALL, 5) self.m_button2 = wx.Button(self, wx.ID_ANY, u"write", wx.DefaultPosition, wx.DefaultSize, 0) bSizer1.Add(self.m_button2, 0, wx.ALL, 5) self.m_listBox1 = wx.ListBox(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_listBox1Choices, 0) bSizer1.Add(self.m_listBox1, 0, wx.ALL, 5) self.SetSizer(bSizer1) self.Layout() self.Centre(wx.BOTH) self.m_button1.Bind(wx.EVT_BUTTON, self.button1_click) self.m_button2.Bind(wx.EVT_BUTTON, self.button2_click) def __del__(self): pass # Virtual event handlers, overide them in your derived class def button1_click(self, event): dialog1 = child_dialog(frame) def button2_click(self, event): # self.m_listBox1.Append(self.list1) pass if __name__ == '__main__': app = wx.App(False) frame = parent_project(None) frame.Show(True) app.MainLoop()
###補足
Anacondaで構築。
Pythonは3.8.10
WxPythonは4.1.1
回答1件
あなたの回答
tips
プレビュー