我正在通过构建一个简单的PyGTK应用程序来学习Python,该应用程序使用pysvn从某些SVN存储库中获取数据。 pysvn客户端有callback,您可以指定它在Subversion需要存储库的身份验证信息时调用。当发生这种情况时,我想打开一个对话框,要求用户提供凭证。
问题是,似乎回调是在GTK主循环中调用的,所以它基本上都是在每个tick上调用的。有办法防止这种情况吗?也许通过在新线程中打开对话框?但是,如何将带有用户数据的元组返回给回调,以便将其返回到pysvn.Client?
答案 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使用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,您将直接引用小部件。
我希望它有所帮助:)