3

pysvnを使用して、いくつかの SVN リポジトリからデータを取得する単純な PyGTK アプリケーションを構築することにより、Python を学習しています。pysvn クライアントには、Subversion がリポジトリの認証情報を必要とするときに呼び出すように指定できるコールバックがあります。その場合、ダイアログを開いてユーザーに資格情報を要求したいと思います。

問題は、コールバックが GTK のメイン ループ内で呼び出されるように見えるため、基本的にティックごとに呼び出されることです。これを防ぐ方法はありますか?おそらく、新しいスレッドでダイアログを開くことによってですか?しかし、ユーザー データを含むタプルをコールバックに返して、それを pysvn.Client に返すにはどうすればよいでしょうか?

4

1 に答える 1

1

これは、RabbitVCS で行う方法です。基本的に、メイン アプリケーションはダイアログを作成し、PyGTK gtk.Dialog run() メソッドを使用して実行します。

私たちが持っているメインアプリからそれを分解します(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 クライアント インスタンスへのコールバックとして渡される関数です。

threads_enter()threads_leave()メソッドに注意してください! これらは GTK が Python スレッドを使用できるようにしますが、GIL は他の拡張機能によってロックされる可能性があることに注意してください。

これが行うことは、ダイアログを作成することです (既にGladeを使用してレイアウトされています)。そのクラスの run() メソッドは、PyGTK メソッドのラッパーです ( dialog.pyを参照)。

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 を使用していない場合は、ウィジェットへの直接参照があります。

私はそれが役立つことを願っています:)

于 2010-05-26T05:32:47.210 に答える