这就是我们在 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,您将直接引用小部件。
我希望它有帮助:)