J'apprends Python en créant une application PyGTK simple qui récupère des données de certains référentiels SVN, en utilisant pysvn. Le client pysvn a un callback, vous pouvez spécifier qu'il appelle lorsque Subversion a besoin d'informations d'authentification pour un référentiel. Quand cela arrive, je voudrais ouvrir une boîte de dialogue pour demander à l'utilisateur les informations d'identification. Le problème est, il semble que le rappel est appelé à l'intérieur de la boucle principale de GTK, donc il est fondamentalement appelé à chaque tick. Est-ce qu'il y a un moyen d'éviter cela? Peut-être en ouvrant le dialogue dans un nouveau fil? Mais alors comment est-ce que je renvoie le tuple avec les données d'utilisateur au rappel ainsi il peut le renvoyer au pysvn.Client?Demande d'informations à l'utilisateur à l'intérieur d'une boucle principale GTK
Répondre
C'est ainsi que nous le faisons dans RabbitVCS. Essentiellement, l'application principale crée la boîte de dialogue et l'exécute en utilisant le PyGTK gtk.Dialog run() method.
Décomposant, de l'application principale, nous avons (voir 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
Cette fonction "get_login" est celui qui est given as the callback à l'instance client pysvn. Remarquez les méthodes threads_enter() et threads_leave()! Ceux-ci permettent à GTK d'utiliser des threads Python, mais notez que le GIL peut être verrouillé par d'autres extensions.
Ce que cela fait est de créer une boîte de dialogue (déjà mis à l'aide Glade), et la méthode run() sur cette classe est une enveloppe pour la méthode PyGTK (voir 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)
L'interface utilisateur rabbitvcs Le code est probablement beaucoup plus compliqué que ce dont vous auriez besoin, mais il pourrait vous aider à fouiller. Ces appels "get_widget" sont des méthodes pratiques pour obtenir le widget de l'arbre Glade. Si vous n'utilisez pas Glade, vous aurez directement des références aux widgets.
J'espère que cela aide :)
il le fait, merci beaucoup! :) –
juste une petite mise à jour, ça fonctionne parfaitement, merci beaucoup, et j'ai aussi téléchargé la source RabbitVCS, on dirait du bon matériel de lecture de code :) –
Ne vous perdez pas là-dedans: P – detly
Je ne sais rien au sujet de pysvn, mais je suppose que le rappel est appelé dans le même thread où vous appelez le code SVN. Avez-vous essayé d'appeler des trucs pysvn qui peuvent demander une connexion dans un fil séparé? – doublep
Vous pouvez utiliser un fichier pour enregistrer les informations et laisser la boucle principale l'obtenir à l'itération suivante. – Eldelshell
Pouvez-vous poster un extrait de code montrant comment vous utilisez le rappel? –