Это то, как мы делаем это в 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 * 1023). *):
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, вероятно, гораздо более запутанный, чем вам нужно, но он может помочь разобраться. Эти вызовы get_widget являются удобными методами для получения виджета из дерева Glade. Если вы не используете Glade, у вас будут ссылки на виджеты напрямую.
Надеюсь, это поможет:)