代码之家  ›  专栏  ›  技术社区  ›  Victor Stanciu

向GTK主循环内的用户请求信息

  •  3
  • Victor Stanciu  · 技术社区  · 15 年前

    我通过构建一个简单的pygtk应用程序来学习python,该应用程序从一些SVN存储库中提取数据,使用 pysvn . Pysvn客户端有一个 callback 您可以指定它在Subversion需要存储库的身份验证信息时调用。当发生这种情况时,我想打开一个对话框,要求用户提供凭据。

    问题是,似乎回调是在GTK主循环中调用的,所以它基本上是在每个勾号上调用的。有没有办法防止这种情况发生?也许通过在新线程中打开对话框?但是,如何将包含用户数据的元组返回回回调,以便它可以将其返回到pysvn.client?

    1 回复  |  直到 15 年前
        1
  •  1
  •   detly    15 年前

    这是我们在拉比特维斯做的。基本上,主应用程序创建对话框并使用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
    

    这个“获取登录”功能就是 given as the callback 到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用户界面代码可能比您需要的要复杂得多,但它可能有助于深入研究。这些“get-widget”调用是从glade树获取widget的方便方法。如果您不使用glade,您将直接拥有对小部件的引用。

    希望有帮助:)

    推荐文章