2012-09-21 3 views
1

아래의 Joran Beasley가 제공 한 답변. 그가 제공 한 링크가 내 필요를 충족 시켰습니다. 질문 하단의 예.wxpython ID에서 객체에 액세스

wxPython 앱에서 생성 된 각 객체는 id을 생성합니다. 매개 변수로 지정하거나 id=wx.NewId()을 사용하여 자동 생성됩니다.

개체의 id을 사용하면 다른 곳에서 해당 개체를 참조 할 수 있지만이 작업을 수행하는 방법에 대한 간단한 설명은 찾을 수 없습니다.

누구나 올바른 방향으로 나를 가리키거나이 문제에 대해 의견을 개진 할 수 있습니까?

(참고 :. 나는 ID를 통해 이벤트를 바인딩을 찾고 있지 않다, 그게 내가 사방에 발견하는 유일한 튜토리얼)

답변 : 클래스 wx.Window에서 발견 기능 FindWindowById()하는 가장 위젯은의 하위 클래스입니다. 객체들 부모에이 함수를 호출하여

는 포인터를 반환 (조부모 등을 시도하지 않은) 객체의 질문에 그 같은 (복사?) : (대화 형 인터프리터)

import wx 
app = wx.App() 
frame = wx.Frame(None) 
but = wx.Button(frame, -1, label='TestButton') 
frame2 = wx.Frame(None) 

butId = but.GetID() 
test = wx.Window.FindWindowById(butId)   # Fails with TypeError 
    # TypeError: unbound method FindWindowById() must be called with Window instance as 
    # first argument (got int instance instead) 
test = Frame2.FindWindowById(butId)   # returned either a None object or nothing at all. 
test = Frame.FindWindowById(butId)    # returned a pionter (copy?) of the object in such a 
    # manner that the following worked: 
label = test.GetLabel() 
print label         # displayed u'TestButton' 

따라서 객체의 id을 알면 더 멀리 처리 할 수 ​​있도록 객체에 대한 포인터를 얻을 수 있습니다. 분명히 함수가 Joran ;-)

+0

임 확실하지 ... 필자는 일반적으로 클래스에 모든 것을 캡슐화 ... 오랫동안 WX의 extensivly을 사용하고 및 ID로받은 적이없는 그 하 당신이 필요로하는 것들에 접근 할 수 있습니다 ... 생성자 주위에 어떤 종류의 래퍼/팩토리 함수를 써서 나중에 찾아보기 위해 전역 사전에 ID를 저장할 수 있습니다 ... –

답변

2

내 덕분에 나는이 일의 내장 방법이 생각 ... 해달라고하지만,이

my_ids = {} 

def widget_factory(widget_class,parent,id,*args,**kwargs): 
    w = widget_class(parent,id,*args,**kwargs) 
    my_ids[id] = w 

def get_widget_by_id(widget_id): 
    return my_ids[widget_id] 

처럼 뭔가를 할 수 .. .

http://wxpython.org/docs/api/wx.Window-class.html#FindWindowById

+0

@joran .. OK, 그래서 링크 된 fuction에 관해서, 그럼 내가 부를거야. 이 함수는 클래스 윈도우의 함수입니다. 그래서 ID와 관련된 창을 얻으려면 wxSomeID ... 바 interperator 열고 자신을 시도 ... 바보 같은 코멘트 – Jase

+0

그래서 어쩌면 당신의 메인 프레임에 전화? –

+0

@ joran ... lol ... 3 가지 버전을 사용해 보았습니다. 하나는 문제의 객체에 함수를 호출하는 것입니다. (우리가 목적의 객체가 없다는 것을 알기 때문에 중복됩니다.) ..... wx.Window.FindObjectById (###)를 두 번 호출합니다. 함수 호출에 대한 자체 데이터를 생성하는 Window 클래스의 인스턴스 없음) ..... 세 부모 수준 개체 test = frame.FindWindowById (###) (성공한) ......... 네 테스트 = frame2.FindWindowById (미스터리 개체의 가계도에없는 프레임 2) (반환하지 않음 (아마도 None ???)을 반환합니다. 소품과 답 신용으로 감사드립니다. 감사합니다. – Jase