2017-11-16 11 views
1

다음은 다른 질문의 복사 된 코드입니다. 독립 실행 형 응용 프로그램으로 잘 작동하지만 pop-up right-click 메뉴는 frame_1을 참조합니다. 이름이 == '': "이 프로그램이 다른 프로그램에 의해 호출 될 때 그대로 거짓입니다. 이 참조는 무엇으로 변경되어야합니까? 감사합니다. .다른 스크립트를 호출 할 때 wx.Frame 오류

import wx 

import sys 
sys.path.append("..") 

from ObjectListView import ObjectListView, ColumnDefn 

### 2. Launcher creates wxMenu. ### 
menu_titles = [ "Open", 
       "Properties", 
       "Rename", 
       "Delete" ] 

menu_title_by_id = {} 
for title in menu_titles: 
    menu_title_by_id[ wx.NewId() ] = title 

class Track(object): 
    """ 
    Simple minded object that represents a song in a music library 
    """ 
    def __init__(self, title, artist, album): 
     self.title = title 
     self.artist = artist 
     self.album = album 

def GetTracks(): 
    """ 
    Return a collection of tracks 
    """ 
    return [ 
     Track("Sweet Lullaby", "Deep Forest", "Deep Forest"), 
     Track("Losing My Religion", "U2", "Out of Time"), 
     Track("En el Pais de la Libertad", "Leon Gieco", "Leon Gieco"), 
    ] 

class MyFrame(wx.Frame): 

    def __init__(self, *args, **kwds): 
     wx.Frame.__init__(self, *args, **kwds) 

     self.Init() 

    def Init(self): 
     self.InitModel() 
     self.InitWidgets() 
     self.InitObjectListView() 

    def InitModel(self): 
     self.songs = GetTracks() 

    def InitWidgets(self): 
     panel = wx.Panel(self, -1) 
     sizer_1 = wx.BoxSizer(wx.VERTICAL) 
     sizer_1.Add(panel, 1, wx.ALL | wx.EXPAND) 
     self.SetSizer(sizer_1) 

     self.myOlv = ObjectListView(panel, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER) 
     sizer_2 = wx.BoxSizer(wx.VERTICAL) 
     sizer_2.Add(self.myOlv, 1, wx.ALL | wx.EXPAND, 4) 
     panel.SetSizer(sizer_2) 

     self.Layout() 

    def InitObjectListView(self): 
     self.myOlv.SetColumns([ 
      ColumnDefn("Title", "left", 120, "title"), 
      ColumnDefn("Artist", "left", 100, "artist"), 
      ColumnDefn("Album", "left", 100, "album") 
     ]) 
     self.myOlv.SetObjects(self.songs) 

     self.myOlv.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.RightClick) 

    def RightClick(self, event): 
     # record what was clicked 
     self.list_item_clicked = self.myOlv.GetSelectedObject() 

     menu = wx.Menu() 
     menu.Bind(wx.EVT_MENU, self.MenuSelectionCb) 

     for (id_, title) in menu_title_by_id.items(): 
      ### 3. Launcher packs menu with Append. ### 
      menu.Append(id_, title) 

     ### 5. Launcher displays menu with call to PopupMenu, invoked on the source component, passing event's GetPoint. ### 
     # self.frame.PopupMenu(menu, event.GetPoint()) 
     frame_1.PopupMenu(menu, event.GetPoint()) 
     menu.Destroy() # destroy to avoid mem leak 

    def MenuSelectionCb(self, event): 
     # do something 
     operation = menu_title_by_id[ event.GetId() ] 
     target = self.list_item_clicked.title 
     print 'Perform "%(operation)s" on "%(target)s."' % vars() 


class MyPopupMenu(wx.Menu): 

    def __init__(self, parent): 
     super(MyPopupMenu, self).__init__() 

     self.parent = parent 

     mmi = wx.MenuItem(self, wx.NewId(), 'Minimize') 
     self.AppendItem(mmi) 
     self.Bind(wx.EVT_MENU, self.OnMinimize, mmi) 

     cmi = wx.MenuItem(self, wx.NewId(), 'Close') 
     self.AppendItem(cmi) 
     self.Bind(wx.EVT_MENU, self.OnClose, cmi) 


    def OnMinimize(self, e): 
     self.parent.Iconize() 

    def OnClose(self, e): 
     self.parent.Close() 


if __name__ == '__main__': 
    app = wx.App(True) 
    wx.InitAllImageHandlers() 
    frame_1 = MyFrame(None, -1, "ObjectListView Track Test") 
    app.SetTopWindow(frame_1) 
    frame_1.Show() 
    app.MainLoop() 

답변

0

코드를 다른 모듈로 가져 오려면 새 주 응용 프로그램 코드에서 해당 프레임을 인스턴스화하면됩니다. 코드를 olv_tracks.py으로 저장하겠습니다. 이제 다음 코드 에서처럼 코드를 가져 오십시오.

import wx 
import olv_tracks 

class MyFrame(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, title='Main App') 
     panel = wx.Panel(self) 

     self.Show() 

     # show other frame 
     frame = olv_tracks.MyFrame(None, -1, "ObjectListView Track Test") 
     frame.Show()   

if __name__ == '__main__': 
    app = wx.App(False) 
    frame = MyFrame() 
    app.MainLoop() 

이제 코드에서와 같은 방법으로 프레임을 인스턴스화하면됩니다.

또한, 당신은 자기마우스 오른쪽 단추로 방법에 frame_1에 대한 참조를 변경해야합니다. 따라서 frame_1.PopupMenu(menu, event.GetPoint()) 대신 self.PopupMenu(menu, event.GetPoint())

이되어야합니다.