2017-12-31 51 views
0

메뉴 클릭의 값을 클래스 변수에 할당하여 해당 값을 여러 클래스에서 사용할 수 있도록하고 싶습니다. 어떤 도움이라도 대단히 감사하겠습니다!wxpython이 이벤트 핸들러에서 변수를 할당합니다.

import wx 

class TrackPanel (wx.Panel): 
    """""" 
    def __init__(self, parent, *args, **kwargs): 
     """Constructor""" 
     wx.Panel.__init__(self, parent, *args, **kwargs) 

     mainSizer =wx.BoxSizer(wx.VERTICAL) 
     track = MasterPage.track_selected # This is where i would like access the variable  
     title = wx.StaticText(self, wx.ID_ANY, label = track) 
     mainSizer.Add(title, 0,wx.ALL | wx.EXPAND | wx.CENTER) 

     self.SetSizerAndFit(mainSizer) 
     self.Layout() 

class MasterPage (wx.Frame): 
    track_selected = ' ' 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     menubar = wx.MenuBar() 
     tracksopt = wx.Menu() 

     track_command = wx.MenuItem(tracksopt, wx.ID_ANY, 'Atlanta') 
     tracksopt.Append(track_command) 
     self.Bind(wx.EVT_MENU, self.change_track, track_command) 
     track_command2 = wx.MenuItem(tracksopt, wx.ID_ANY, 'Texas') 
     tracksopt.Append(track_command2) 
     self.Bind(wx.EVT_MENU, self.change_track, track_command2)   

     menubar.Append(tracksopt, '&Tracks') 
     self.SetMenuBar(menubar)      

    def change_track (self, event): 
     """Changes the tack_selected variable based on the menu item picked""" 
     id_selected = event.GetId() 
     obj = event.GetEventObject() 
     track_id= obj.GetLabel(id_selected) 
     MasterPage.track_selected = track_id 

답변

1

트래커가 마스터의 값에 액세스하려면 트래커에서 마스터에 대한 링크를 만들어야합니다.

import wx 

class Track (wx.Frame): 
    def __init__(self, link): 
     wx.Frame.__init__(self, None) 
     self.link = link 
     self.tc = wx.TextCtrl(self, style=wx.TE_MULTILINE) 
     self.bt = wx.Button(self, label="tracker (push to read master)") 
     self.bt.Bind(wx.EVT_BUTTON, self.on_read_master) 
     self.Title = 'Tracker' 
     sz_1 = wx.BoxSizer(wx.HORIZONTAL) 
     sz_2 = wx.BoxSizer(wx.VERTICAL) 
     sz_2.Add(self.tc, 1, wx.EXPAND, 0) 
     sz_2.Add(self.bt, 0, wx.EXPAND, 0) 
     sz_1.Add(sz_2, 1, wx.EXPAND, 0) 
     self.SetSizer(sz_1) 
     self.Layout() 
     self.SetSize((250, 100)) 

    def on_read_master(self, evt): 
     self.tc.SetValue(self.link.track_selected) # here you access the variable) 

class Master(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None) 
     self.track_selected = '0' 
     self.tc = wx.TextCtrl(self, wx.ID_ANY, "", style=wx.TE_MULTILINE) 
     self.bt = wx.Button(self, wx.ID_ANY, "master (push to send)") 
     self.bt.Bind(wx.EVT_BUTTON, self.change_track) 
     self.Title = 'Master' 
     self.tc.SetValue('enter value to be read by the tracker') 
     sz_1 = wx.BoxSizer(wx.HORIZONTAL) 
     sz_2 = wx.BoxSizer(wx.VERTICAL) 
     sz_2.Add(self.tc, 1, wx.EXPAND, 0) 
     sz_2.Add(self.bt, 0, wx.EXPAND, 0) 
     sz_1.Add(sz_2, 1, wx.EXPAND, 0) 
     self.SetSizer(sz_1) 
     self.Layout() 
     self.SetSize((250, 100)) 

    def change_track (self, evt): 
     """Changes variable based on text entered""" 
     self.track_selected = self.tc.GetValue() 

if __name__ == "__main__": 
    app = wx.App(0) 
    master = Master() 
    track = Track(master) 
    master.Show() 
    track.Show() 
    app.MainLoop() 

이것은 일반적으로 사용하는 빠르고 더러운 방법입니다. 보다 정교한 것을 원할 경우, 프레임간에 메시지를 전달하는 전용 라이브러리가 있습니다 (pubsub). 그것을 사용하는 방법에 대한 좋은 지침서는에서 찾을 수 있습니다 Mike Driscoll blog

+0

정말 고마워요! 나는 당신이 언급 한 블로그를 체크 아웃해야합니다. – Alstar158