3

我正在通过构建一个简单的 PyGTK 应用程序来学习 Python,该应用程序使用pysvn从一些 SVN 存储库中获取数据。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 回答