我已经成功地学习了一段时间的Python。使用PyGtk+Glade,我甚至成功地创建了1或2个简单的程序。
问题是:我不确定在Python中使用GTK的最佳方式是否是通过使用Glade构建界面。
我想知道有经验的人(请记住,我只是一个初学者)能否指出使用Glade相对于在代码中创建一切的优点和注意事项(假设学习正确的GTK绑定并不是问题)。
我已经成功地学习了一段时间的Python。使用PyGtk+Glade,我甚至成功地创建了1或2个简单的程序。
问题是:我不确定在Python中使用GTK的最佳方式是否是通过使用Glade构建界面。
我想知道有经验的人(请记住,我只是一个初学者)能否指出使用Glade相对于在代码中创建一切的优点和注意事项(假设学习正确的GTK绑定并不是问题)。
使用GtkBuilder替代Glade,它被整合到了Gtk中,而不是一个单独的库。
Glade的主要优点在于创建接口更加容易。连接信号处理程序需要一些额外的工作,但我从未觉得这很重要。
我最初使用了 Glade,但很快就转而采用纯代码编写。Glade 对于简单的事情很好用,当你学习 GTK 如何组织小部件(如何打包等)时也是很有帮助的。然而,完全通过代码构建你有更多的灵活性。此外,你不必依赖 Glade。
Glade非常有用,可以轻松创建界面,这意味着你不需要进行太多编码就能轻松更改GUI。但是如果你想做任何有用的事情(例如构建一个树视图),你必须熟悉GTK文档的各个部分 - 实际上找到一个好的教程/示例。
如果你正在编写一个传统的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开始,直到遇到需要的功能不支持,例如创建向导。只要我使用Glade提供的标准小部件,就没有理由手动编写GUI。
我越熟悉Glade格式化代码的方式,我的手动编码就越好。更不用说,使用Glade制作底层框架非常容易,这样您就不必担心所有的初始化问题。
首先,需要正确看待这个问题。
您将使用GTK。这是一个庞大的C库,建于1993年,采用了1970年代编程风格的最佳传统。它是为帮助实现GIMP而构建的,GIMP是一个想要成为Photoshop竞争对手的软件,其用户界面存在着很多问题。一个典型的GUI字段可能有四十个或更多参数,大多数是重复的,具有getter和setter。这将会很痛苦。
GTK本身在C中使用GObject管理完整的动态类型系统。这使得调试成为一种特殊的乐趣,需要手动遍历充满通用参数列表和隐式继承的方法指针数组。你也将在最不经意的时候跳过Pango库,例如,在标签中使用Pango常量来确定省略号在页面缩小时的位置。期望更多的痛苦。
到现在为止,你可能已经发誓要将所有的GTK交互都包裹在一个特定于你的应用程序的模型-视图-控制器架构中。这是好的。
使用Glade、gtkBuilder或Stetic将有助于解决函数与四十个参数之间的巨大耦合问题。Glade提供了一个基本的GUI构建器,可以拖放组件。参数和继承参数有些分离。Glade的输出是.glade XML文件,然后你会读取它,在其中附加你的回调(“信号处理程序”)到具有相同名称的函数,并查询或更新该XML的内存版本,以获取小部件,然后使用pyGTK来操作。Glade本身已经过时且没有得到很好的维护。
使用pyGTK将为您提供烦人的精细控制,以构建您的GUI。这将是冗长的、复制并粘贴的代码。每个属性都将是一个单独的函数调用。属性设置器不会返回任何东西,因此无法链接调用。通常,您的IDE只会对函数意义给出最少的帮助,您将不断地参考DevHelp或其他工具。
几乎可以认为GTK GUI是注定要失败的。
我建议在快速开发时使用Glade,但不适合学习。为什么呢?因为有时您需要调整一些小部件以使其按照您的意愿工作,如果您不真正了解每个小部件的属性,则可能会遇到麻烦。
对于快速简单的屏幕,我使用Glade。但对于需要更精细控制的任何内容,我会为实际需要创建自定义类(这很重要,因为很容易被概括性的东西带偏)。
通过使用瘦应用程序特定类,我可以从一个地方快速更改整个应用程序的外观和感觉。就像使用CSS来维护网站的一致性一样。
个人而言,我建议编写代码而不是使用Glade。我仍在学习Python和PyGtk,但我会说手动编写UI让我对底层的工作原理有了很多了解。
一旦你学会了它,我建议尝试使用Glade或其他UI设计工具,但一定要先学会“困难”的方法。