2010-05-19 4 views
3

pysvn을 사용하여 일부 SVN 저장소에서 데이터를 가져 오는 간단한 PyGTK 애플리케이션을 작성하여 Python을 배우고 있습니다. pysvn 클라이언트는 callback을 가지고 있습니다. Subversion이 저장소에 대한 인증 정보를 필요로 할 때 호출하도록 지정할 수 있습니다. 그런 일이 생길 때마다 사용자에게 자격 증명을 묻는 대화 상자를 열고 싶습니다.GTK 메인 루프 내에서 사용자로부터 정보 요청하기

문제는 콜백이 GTK 메인 루프 내부에서 호출되는 것입니다. 따라서 기본적으로 모든 틱마다 호출됩니다. 이것을 막을 수있는 방법이 있습니까? 대화 상자를 새 스레드에서 열어 볼까요? 그런 다음 사용자 데이터가 포함 된 튜플을 콜백에 반환하여 pysvn.Client에 반환 할 수 있습니까?

+0

내가 pysvn에 대해 아무것도 몰라 희망,하지만 난 콜백이 당신이 SVN 코드를 호출 동일한 스레드에서 호출되어 가정 것입니다. 별도의 스레드에서 로그인을 요청할 수있는 pysvn을 호출 해 보았습니까? – doublep

+0

파일을 사용하여 정보를 저장하고 메인 루프가 다음 반복에서 정보를 얻도록 할 수 있습니다. – Eldelshell

+0

콜백 사용 방법을 보여주는 코드 스 니펫을 게시 할 수 있습니까? –

답변

1

이것이 우리가 RabbitVCS에서하는 방법입니다. 본질적으로 메인 애플리케이션은 대화 상자를 생성하고 PyGTK gtk.Dialog run() method을 사용하여 실행합니다.

우리가 가지고있는 주요 응용 프로그램 (action.py 참조)에서 내려 속보 :

def get_login(self, realm, username, may_save): 

    # ...other code omitted... 

    gtk.gdk.threads_enter() 
    dialog = rabbitvcs.ui.dialog.Authentication(
     realm, 
     may_save 
    ) 
    result = dialog.run() 
    gtk.gdk.threads_leave() 

    return result 

이 "get_login"기능은 PySVN 클라이언트 인스턴스에 given as the callback 인 하나입니다.

threads_enter()threads_leave() 메서드에 유의하십시오. 이것들은 GTK가 파이썬 쓰레드를 사용할 수있게하지만 GIL은 다른 확장에 의해 잠길 수 있습니다. 이것은 무엇을

이 대화 상자를 만드는 것입니다 (dialog.py 참조) (이미 Glade을 사용하여 배치), 그 클래스의 run() 메소드는 PyGTK 방법에 대한 래퍼입니다 :

def run(self): 
    returner = None 
    self.dialog = self.get_widget("Authentication") 
    result = self.dialog.run() 

    login = self.get_widget("auth_login").get_text() 
    password = self.get_widget("auth_password").get_text() 
    save = self.get_widget("auth_save").get_active() 
    self.dialog.destroy() 

    if result == gtk.RESPONSE_OK: 
     return (True, login, password, save) 
    else: 
     return (False, "", "", False) 

RabbitVCS UI를 코드는 아마도 당신이 필요로하는 것보다 훨씬 복잡하지만, 주위를 찌르는 데 도움이 될 수 있습니다. 이러한 "get_widget"호출은 Glade 트리에서 위젯을 가져 오는 편리한 메소드입니다. Glade를 사용하지 않는 경우, 위젯에 대한 참조가 직접 생깁니다.

나는 그것이 도움이 :)

+0

대단히 감사합니다! :) –

+0

그냥 약간의 업데이 트가 완벽하게 작동합니다, 대단히 감사합니다, 나는 또한 RabbitVCS 소스를 다운로드, 그것은 좋은 코드를 읽고 자료와 같다 :) –

+0

거기에 길을 잃지 마세요 : P는 – detly