これは、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 を使用していない場合は、ウィジェットへの直接参照があります。
私はそれが役立つことを願っています:)