2012-04-03 3 views
0

Вот код в вопросе:ссылки на объекты из других модулей

import wx 


class MyFrame(wx.Frame): 
    """ 
    This is MyFrame. It just shows a few controls on a wxPanel, 
    and has a simple menu. 
    """ 

    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, -1, title, 
          pos=(150, 150), size=(350, 200)) 

     # Create the menubar 
     menuBar = wx.MenuBar() 

     # and a menu 
     menu = wx.Menu() 

     # add an item to the menu, using \tKeyName automatically 
     # creates an accelerator, the third param is some help text 
     # that will show up in the statusbar 
     menu.Append(wx.ID_EXIT, "E&xit\tAlt-X", "Exit this simple sample") 

     # bind the menu event to an event handler 
     self.Bind(wx.EVT_MENU, self.OnTimeToClose, id=wx.ID_EXIT) 

     # and put the menu on the menubar 
     menuBar.Append(menu, "&File") 
     self.SetMenuBar(menuBar) 

     self.CreateStatusBar() 

     # Now create the Panel to put the other controls on. 
     panel = wx.Panel(self) 

     # and a few controls 
     text = wx.StaticText(panel, -1, self.istream) 
     text.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD)) 
     text.SetSize(text.GetBestSize()) 
     btn = wx.Button(panel, -1, "Close") 
     funbtn = wx.Button(panel, -1, "Just for fun...") 

     # bind the button events to handlers 
     self.Bind(wx.EVT_BUTTON, self.OnTimeToClose, btn) 
     self.Bind(wx.EVT_BUTTON, self.OnFunButton, funbtn) 

     # Use a sizer to layout the controls, stacked vertically and with 
     # a 10 pixel border around each 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(text, 0, wx.ALL, 10) 
     sizer.Add(btn, 0, wx.ALL, 10) 
     sizer.Add(funbtn, 0, wx.ALL, 10) 
     panel.SetSizer(sizer) 
     panel.Layout() 


    def OnTimeToClose(self, evt): 
     """Event handler for the button click.""" 
     print "See ya later!" 
     self.Close() 


    def OnFunButton(self, evt): 
     """Event handler for the button click.""" 

     self.istream = raw_input('Press ENTER to EXIT...\n') 


class MyApp(wx.App): 

    def OnInit(self): 
     frame = MyFrame(None, "Simple wxPython App") 
     self.SetTopWindow(frame) 

     print "Print statements go to this stdout window by default." 

     frame.Show(True) 
     return True 


app = MyApp(redirect=True) 
app.MainLoop() 

Я получаю сообщение об ошибке, что объект MyFrame не имеет атрибута IStream. Я не уверен, почему это так, потому что даже в PyScripter под проводником кода он перечисляет istream как атрибут MyFrame. У меня такое чувство, что я теряю здесь нечто очень важное. Есть предположения?

(кстати, игнорировать ошибки отступов, его из-за кодовый блок форматирования.)

+0

Нет, ошибки в отступлении связаны с тем, что вы не ввели вопрос правильно. Будьте точны. –

+1

Кроме того, название вопроса бесполезно. Он не имеет ничего общего с другими модулями. Попробуйте что-то вроде «отсутствующего атрибута istream» в экземпляре подкласса wx.Frame ». – aaronasterling

ответ

1

Метода __init__ (который ожидает, что self.istream подлежит определение) выполняется перед OnFunButton методом, который определяет self.istream. Таким образом, вы видите сообщение «MyFrame не имеет атрибута istream», потому что __init__ ищет self.istream, но он еще не определен.

Прежде чем использовать переменную, вам необходимо определить self.istream.

Смежные вопросы