2014-01-10 10 views
1

경험 많은 C 프로그래머, 파이썬에서 총 noob. 파이썬 wx 사용하기. 객체라는 액션의 정의에서 , 나는 선언AttributeError : '작업'객체에 'text1'속성이 없습니다.

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

win.SetLabel (예, "액션 :

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

을하지만 난 콜백에 주요 모듈에 액세스하기 위해 갈 때 ")

나는

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

(나는 모든 24 '의 QUES을 통해 내가 갈 것을 추가 서둘러 도착 이미 당신의 대답을 가지고 있을지도 모르지만 관련성이 없다는 것을 발견했다.). 모든 철자를 확인하고 다시 검사했습니다. 는 또한 액션의 정의에이 기능을 추가하는 시도 : 나는 호출하면 같은 오류 얻을

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

: (! 놀라운)

win.text2.SetLabel("testing") 

합니다. (그러나 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

당신은 모든뿐만 아니라 텍스트 1 self.text1을해야 이 클래스가 갖기를 원하는 다른 속성. text1은 InitUI 내부의 로컬 변수입니다.

+0

그는 'self.text2'에 대해 질문하고 있습니다. 이것은 문제가되지 않습니다. – abarnert

+0

@abarnert 제목은 'text1'로되어있어 이해하기 쉬운 실수입니다. OP는 사물의 모습에서 어쨌든'자기 '를 잊어 버리는 지속적인 문제를 안고 있습니다. 'text2'를위한'sizer.Add()'호출은 또한 인자에서'text2'를 참조 할 때'self'를 빠뜨립니다. –

+0

@SilasRay : 물론, 그렇다고해서이 대답이 OP가 고착 된 문제를 해결할 수있는 것은 아닙니다. 그의 코드에서 다른 문제를 설명하는 주석이 도움이 될 수는 있지만 대답은 아닙니다. – abarnert

2

InitUI 방법까지 text2 특성을 만들지 않습니다. 하지만 메서드가 호출되기 전에 액세스하려고합니다.

일반적으로 wx의 InitUI 관용어에서는 this example과 같이 __init__ 메서드에서 self.InitUI()을 명시 적으로 호출합니다. 너는 그렇게하지 않는다.

그래서, 당신은 할 때 :

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

당신은 win.__init__라고했지만, 그것은 InitUI라고하지, 어느 쪽도 아니 무엇을 가지고, 그래서 속성이 아직 존재하지 않습니다.

+0

많은 감사 abarnert. 그리고 너무 쉬운 수정! – user3183042

-1

Ooops 죄송합니다. 매우 신중하게 읽지 않았습니다.

win.text2.SetLabel ("testing")을 win.text2 = "testing"으로 변경할 수 있습니다. 이 코드의 위치는 python이 textL2가 Action 내부의 객체이며 SetLabel이라는 자체 메서드로 생각합니다. 그게 왜 그것을 찾을 수 없습니다.

+0

나는 당신이 에러에 대한 당신의 가정 된 설명을 얻지 못했지만 그것이 틀렸다는 것을 확신합니다. abarnerts 대답에 따르면, 그는 실제로 속성에 액세스하려고하기 전에 속성을 만드는 함수를 호출하지 않았습니다 ... – l4mpi

관련 문제