2014-01-10 34 views
1

經驗豐富的C程序員,在Python中總noob。 使用python wx。 在命名對象操作的定義,我宣佈:AttributeError:'Action'對象沒有屬性'text1'

self.text2 = wx.StaticText(panel, label="Name") 

,但是當我去訪問它的主模塊中的回調:

def OnComboSelect(self, e): 
     print self.combo.GetValue() 
     win = Action(self, "Action") 
      win.text2.SetLabel("testing") 

win.SetLabel(e行「行動「)

我得到

AttributeError: 'Action' object has no attribute 'text2' 

(我趕緊補充說,我已經通過所有24「疑問句tions可能已經有你的答案「,但沒有發現任何相關信息)。 我已檢查並重新檢查所有拼寫。 我也嘗試添加此功能來行動的定義:

def SetLabel(self, event, label): 
    self.text2.SetLabel("testing") 

它得到如果我叫了同樣的錯誤:(!驚喜)

win.text2.SetLabel("testing") 

。 (但是沒有關於Def定義SetLabel的投訴)。這是在需要的情況下完整的代碼(這是簡單的示例代碼,從我小的奮鬥修改它,拆開,這是非常排序):

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

# action.py 

import wx 

class Action(wx.Frame): 

    def __init__(self, parent, title):  
     super(Action, self).__init__(parent, title=title, 
      size=(450, 350)) 


    def InitUI(self): 

     panel = wx.Panel(self) 

     sizer = wx.GridBagSizer(5, 5) 

     text1 = wx.StaticText(panel, label="Ink Cartridge Type") 
     sizer.Add(text1, pos=(0, 0), flag=wx.TOP|wx.LEFT|wx.BOTTOM, 
      border=15) 

     icon = wx.StaticBitmap(panel, bitmap=wx.Bitmap('ink64.png')) 
     sizer.Add(icon, pos=(0, 4), flag=wx.TOP|wx.RIGHT|wx.ALIGN_RIGHT, 
      border=5) 

     line = wx.StaticLine(panel) 
     sizer.Add(line, pos=(1, 0), span=(1, 5), 
      flag=wx.EXPAND|wx.BOTTOM, border=10) 

     self.text2 = wx.StaticText(panel, label="Name") 
     sizer.Add(text2, pos=(2, 0), flag=wx.LEFT, border=10) 

     self.tc1 = wx.TextCtrl(panel) 
     sizer.Add(self.tc1, pos=(2, 1), span=(1, 3), flag=wx.TOP|wx.EXPAND) 

     text3 = wx.StaticText(panel, label="Package") 
     sizer.Add(text3, pos=(3, 0), flag=wx.LEFT|wx.TOP, border=10) 

     tc2 = wx.TextCtrl(panel) 
     sizer.Add(tc2, pos=(3, 1), span=(1, 3), flag=wx.TOP|wx.EXPAND, 
      border=5) 

     button1 = wx.Button(panel, label="Browse...") 
     sizer.Add(button1, pos=(3, 4), flag=wx.TOP|wx.RIGHT, border=5) 

     text4 = wx.StaticText(panel, label="Extends") 
     sizer.Add(text4, pos=(4, 0), flag=wx.TOP|wx.LEFT, border=10) 

     combo = wx.ComboBox(panel) 
     sizer.Add(combo, pos=(4, 1), span=(1, 3), 
      flag=wx.TOP|wx.EXPAND, border=5) 

     button2 = wx.Button(panel, label="Browse...") 
     sizer.Add(button2, pos=(4, 4), flag=wx.TOP|wx.RIGHT, border=5) 

     sb = wx.StaticBox(panel, label="Optional Attributes") 

     boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL) 
     boxsizer.Add(wx.CheckBox(panel, label="Public"), 
      flag=wx.LEFT|wx.TOP, border=5) 
     boxsizer.Add(wx.CheckBox(panel, label="Generate Default Constructor"), 
      flag=wx.LEFT, border=5) 
     boxsizer.Add(wx.CheckBox(panel, label="Generate Main Method"), 
      flag=wx.LEFT|wx.BOTTOM, border=5) 
     sizer.Add(boxsizer, pos=(5, 0), span=(1, 5), 
      flag=wx.EXPAND|wx.TOP|wx.LEFT|wx.RIGHT , border=10) 

     button3 = wx.Button(panel, label='Help') 
     sizer.Add(button3, pos=(7, 0), flag=wx.LEFT, border=10) 

     button4 = wx.Button(panel, label="Ok") 
     sizer.Add(button4, pos=(7, 3)) 

     # Set event handlers 
     button4.Bind(wx.EVT_BUTTON, self.OnButton) 

     button5 = wx.Button(panel, label="Cancel") 
     sizer.Add(button5, pos=(7, 4), span=(1, 1), 
      flag=wx.BOTTOM|wx.RIGHT, border=5) 

     sizer.AddGrowableCol(2) 

     panel.SetSizer(sizer) 

    def OnButton(self, event): 
     self.tc1.GetValue() 

    def SetLabel(self, event, label): 
     self.text2.SetLabel("testing") 
+0

需要注意的是:與許多其他OO語言不同,Python在成員方法中沒有隱式實例範圍。如果你想引用一個實例的屬性,你必須每次都從'self'明確引用它們,除非你首先在方法範圍中重新綁定它們。 –

回答

0

你必須做的text1 self.text1以及每你想讓這個類擁有的其他屬性。由於text1只是InitUI中的局部變量。

+0

他在問'self.text2',這是一個屬性。這不是問題。 – abarnert

+0

@abarnert標題說'text1',所以這是一個可以理解的錯誤。無論如何,從事物的角度來看,OP總是存在一個遺忘「自我」的問題。例如,在參數中引用「text2」時,對'text2'的sizer.Add()'調用也缺少'self'。 –

+0

@SilasRay:當然,但這並不意味着這個答案將解決OP被困住的問題。解釋其代碼中的其他問題的評論會有幫助,但不是答案。 – abarnert

2

直到InitUI方法爲止,您才創建text2屬性。但是在你調用方法之前你正試圖訪問它。

通常,在wx的InitUI成語中,您可以通過__init__方法明確調用self.InitUI(),如this example。你沒有那樣做。

所以,當你這樣做:

win = Action(self, "Action") 
win.text2.SetLabel("testing") 

你叫win.__init__,但它不叫InitUI,並且都沒有別的,所以屬性尚不存在。

+0

非常感謝。還有一個很好的簡單解決方法! – user3183042

-1

抱歉抱歉沒有仔細閱讀。

您可以將win.text2.SetLabel(「testing」)更改爲win.text2 =「testing」 此代碼在此處的方式python認爲text2是Action內部的一個對象,其自身的方法名爲SetLabel。這就是爲什麼它無法找到它。

+0

我不確定我是否可以解釋錯誤,但我確定這是錯誤的。正如abarnerts回答說的那樣,他只是沒有在嘗試訪問它之前調用創建屬性的函數。 – l4mpi