2017-06-21 55 views
1

代碼我的工作:wxPython的 - 如何通過其他類存取權限類實例

class MyApp(wx.App): 
    def OnInit(self): 
     frame = MainWindow(None, -1, 'MyApp') 
     frame.SetIcon(wx.Icon('tutorial.ico', wx.BITMAP_TYPE_ICO)) 
     frame.Center() 
     frame.Show(True) 
     return True 


class MainWindow(wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(620, 480)) 
     menubar = wx.MenuBar() 
     file = wx.Menu() 
     edit = wx.Menu() 
     help = wx.Menu() 
     file.Append(101, '&New\tCtrl+N') 
     file.AppendSeparator() 
     file.Append(102, '&Open\tCtrl+O') 
     file.Append(103, '&Save\tCtrl+S') 
     file.Append(104, '&Save As...') 
     file.AppendSeparator() 
     file.Append(105, '&Settings') 
     file.Append(106, '&Quit\tCtrl+Q') 

     self.model = wx.MenuItem(edit, 201, '&Model', 'Model Mode', kind = wx.ITEM_CHECK) 

     self.box = wx.BoxSizer(wx.VERTICAL)   
     self.c = CubeCanvas(self) 
     self.c.SetMinSize((200, 200)) 
     self.box.Add(self.c, 0, wx.EXPAND |wx.ALL , 15) 


class MyCanvasBase(glcanvas.GLCanvas): 
    def __init__(self, parent): 
     glcanvas.GLCanvas.__init__(self, parent, -1) 
     self.init = False 
     self.context = glcanvas.GLContext(self) 

     self.lastx = self.x = 30 
     self.lasty = self.y = 30 
     self.size = None 
     self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) 
     self.Bind(wx.EVT_MOTION, self.OnMouseMotion) 

     def OnMouseMotion(self, evt): 
      if frame.model.IsChecked(): #NameError: name 'frame' is not defined 
       self.lastx, self.lasty = self.x, self.y 
       self.x, self.y = evt.GetPosition() 
       self.Refresh(False) 


class CubeCanvas(MyCanvasBase): 
    def InitGL(self): 
     # set viewing projection 
     glMatrixMode(GL_PROJECTION) 
     glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0) 
     # position viewer 
     glMatrixMode(GL_MODELVIEW) 
     glTranslatef(0.0, 0.0, -2.0) 
     glEnable(GL_BLEND) 
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 
     glEnable(GL_LINE_SMOOTH) 
     glHint(GL_LINE_SMOOTH_HINT, GL_NICEST) 
     glEnable(GL_POLYGON_SMOOTH) 
     glEnable(GL_DEPTH_TEST) 
     glEnable(GL_LIGHTING) 
     glEnable(GL_LIGHT0) 

    def OnDraw(self): 
     # clear color and depth buffers 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
     w, h = self.size 
     w = max(w, 1.0) 
     h = max(h, 1.0) 
     dx = self.x/(w/2) - 1.0 
     dy = self.y/(h/2) - 1.0 
     glLineWidth(2.5) 
     glColor3f(1.0, 0.0, 0.0) 
     glBegin(GL_LINES) 
     glVertex2f(0, 0) 
     glVertex2f(dx, -dy) 
     glEnd() 
     self.SwapBuffers() 


statica = MyApp(0) 
statica.MainLoop() 

如何從另一個類的方法訪問MainWindowmodel變量,像MyCanvasBase.onMouseMotionwxPython可以嗎?

我試過了:frame.model,MainWindow.model,沒有成功。

如何解決這樣的問題,如wxPython中類之間的通信?在C++中,我有main函數,在python中所有的邏輯都是在__init__或方法中。

+0

[Python中的對象之間的通訊]的可能的複製(https://stackoverflow.com/questions/15998799/communicating-之間的對象功能於蟒) –

回答