我已经学习 python 一段时间了,并取得了一些成功。我什至设法使用 PyGtk + Glade 创建了一两个(简单)程序。
问题是:我不确定将 GTK 与 python 结合使用的最佳方法是否是使用 Glade 构建接口。
我想知道我们当中更有经验的人(记住,我只是一个初学者)是否可以指出使用 Glade 而不是在代码本身中创建所有内容的好处和注意事项(假设学习正确的 gtk 绑定不会确实是个问题)。
我会说这取决于:如果您发现使用 Glade 可以构建您想要或需要制作的应用程序,那绝对没问题。但是,如果您真的想了解 GTK 的工作原理,或者您有一些非标准的 UI 要求,您将不得不深入研究 GTK 内部(并不那么复杂)。
就我个人而言,当我需要一些功能或定制时,我通常会在大约 5 分钟内进入富客户端,而这些功能或定制是通过 Glade 或Stetic等设计器根本不可能实现的。也许这只是我。尽管如此,使用图形工具引导窗口设计对我来说仍然很有用。
我的建议:如果使用 GTK 打造富客户端将成为你工作/爱好的重要组成部分,那么也要学习 GTK,因为有一天你需要编写该代码。
PS我个人认为Stetic在设计工作上优于Glade,如果有点不稳定的话。
使用 GtkBuilder 代替 Glade,它集成到 Gtk 本身而不是单独的库中。
Glade 的主要好处是创建界面要容易得多。连接信号处理程序需要做更多的工作,但我从来没有觉得这很重要。
Glade 对于创建界面非常有用,这意味着您无需编写太多代码即可轻松更改 GUI。您会发现,如果您想做任何有用的事情(例如构建树视图),您必须熟悉 GTK 文档的各个部分——在实践中找到一个好的教程/示例。
我开始使用 glade,但很快就开始用代码做所有事情。Glade 非常适合简单的事情,当您学习 GTK 如何组织小部件(事情如何打包等)时,它也很好。但是,在代码中构建所有内容,您将拥有更大的灵活性。另外,您没有林间空地依赖性。
我通常从 Glade 开始,直到它没有我需要的功能,例如创建向导。只要我使用 Glade 提供的标准小部件,就没有理由手动编写 GUI。
我对 Glade 格式化代码的方式越熟悉,我的手工编码就越好。更不用说,使用 Glade 制作底层框架真的很容易,所以你不必担心所有的初始化。
如果你正在编写一个传统的 GUI 应用程序,它重用了来自 GTK+ 的许多标准组件(按钮、标签、容器等),我个人会选择 Glade + Kiwi(一个用于构建 GTK+ GUI 应用程序的便利框架)。
使用 Glade 的最大优势是它大大减少了布局/打包代码。这是一个非常简单的示例,它已经显示了手动布局 GUI 的问题(不使用任何辅助函数):
container = gtk.HBox()
label = gtk.Label(str="test")
container.add(label)
有关更多示例,请查看此处。即使您正在编写一个复杂的自定义小部件,您也始终可以在 Glade 中创建一个占位符并在实例化后替换它。
对于 Glade 团队来说,发布新版本的设计器 (3.6.0) 应该不会太久。这个新版本将添加对 GtkBuilder 的支持,它取代了 libglade(将 Glade XML 文件转换为小部件树的实际库)。新的 Glade 设计器还再次添加了对在 Python 中定义目录(小部件集)的支持,因此您可以轻松添加自己的自定义小部件。
我建议使用 Glade 进行快速开发,但不要用于学习。为什么?因为有时您需要调整一些小部件才能按您希望的方式工作,如果您并不真正了解/理解每个小部件的属性,那么您将遇到麻烦。
首先,开始正确看待这一点。
您将使用 GTK。这是一个巨大的 C 库,建于 1993 年,使用 1970 年代编码风格的最佳传统。它旨在帮助实现 GIMP,这是 Photoshop 的竞争对手,想要成为具有传奇色彩的用户界面错误。一个典型的 gui 字段可能有四十个或更多参数,大部分是重复的,有 getter 和 setter。会有痛苦。
GTK 本身使用 GObject 在 C 中管理一个完整的动态类型系统。这使得调试成为一种特别的乐趣,需要手动遍历指向方法的指针数组,这些方法充满了具有隐式继承的通用参数列表。当您最不期望它时,您还将跳过 Pango 库,例如,当页面较小时,使用 Pango 常量表示省略号在标签中的位置。期待更多的痛苦。
到目前为止,您可能已经发誓要将所有 GTK 交互封装在特定于您的应用程序的模型-视图-控制器架构中。这很好。
使用 Glade,或 gtkBuilder,或 Stetic,将有助于解决由 40 个参数到一个函数的巨大耦合问题。Glade 提供了一个基本的 GUI 构建器来将组件拖放到一起。参数和继承的参数有些分离。Glade 的输出是 .glade XML 文件,然后您将读入该文件,将回调(“信号处理程序”)附加到同名函数,并查询或更新该 XML 的内存版本以获取然后使用 pyGTK 的小部件操纵。林间空地本身是一个吱吱作响的,维护得不好。
使用 pyGTK 为您提供了令人讨厌的细粒度控制,以便构建您的 GUI。这将是冗长的复制粘贴代码。每个属性将是一个单独的函数调用。属性设置器不返回任何内容,因此链接调用是不可能的。通常,您的 IDE 只会对函数的含义提供很少的帮助,并且您会不断地参考 DevHelp 或其他一些工具。
人们几乎会认为 GTK GUI 注定要失败。
对于快速简单的屏幕,我使用 Glade。但是对于任何需要更精细控制的东西,我会为我真正需要的东西创建一个自定义类(这很重要,因为它很容易被概括而忘乎所以)。
使用瘦应用程序特定类,我可以从一个地方快速更改应用程序的外观和感觉。更像是使用 CSS 来保持网站的一致性。
就个人而言,我建议将其编码而不是使用 Glade。我仍在学习 python 和 pyGtk,但我会说,手工写出 UI 让我对事情的运作方式有了很多了解。
一旦你学会了它,我会说给 glade 或其他 UI 设计师一试,但绝对要先学习如何以“硬”的方式去做。
你可以使用glade-2来设计,使用glade2py.py生成纯pygtk代码,它使用pygtkcompat来支持gtk3