用不用Glade:使用PyGtk的最佳方式是什么?

33

我已经成功地学习了一段时间的Python。使用PyGtk+Glade,我甚至成功地创建了1或2个简单的程序。

问题是:我不确定在Python中使用GTK的最佳方式是否是通过使用Glade构建界面。

我想知道有经验的人(请记住,我只是一个初学者)能否指出使用Glade相对于在代码中创建一切的优点和注意事项(假设学习正确的GTK绑定并不是问题)。


除了Glade之外,还有更多的UI构建器,也许你应该提到“UI构建器”而不仅仅是Glade。 - Johan Dahlin
1
使用构建GtkBuilder UI XML的图形工具对于大多数gtk程序来说肯定是标准的。它不能代替你自己使用gtk api工作,但肯定使其他人更容易理解你的代码。 - Thomas Ahle
11个回答

20
我想说这取决于情况:如果您发现使用Glade可以构建您想要或需要创建的应用程序,那就没问题了。但是,如果您确实想学习GTK的工作原理或者有一些非标准用户界面需求,您将不得不深入了解GTK的内部结构(这并不复杂)。
个人而言,当我制作富客户端时,大约在5分钟内就需要某些功能或自定义,而这些功能或自定义是通过诸如Glade或Stetic之类的设计师简直不可能实现。也许只是我这样。尽管如此,对我来说,使用图形工具启动窗口设计仍然很有用。
我的建议:如果使用GTK制作富客户端将成为您工作/爱好的重要组成部分,则学习GTK,因为总有一天您需要编写那些代码。
P.S. 我个人发现Stetic在设计工作方面比Glade更优秀,尽管有点不太稳定。

1
由于Glade生成的是XML文件,而不是实际的Python代码,有没有一个好的方法可以使用Glade开始一个项目,然后手工编码或修改它?我个人刚开始学习Glade。 - TimothyAWiseman
1
我认为这个评论值得单独发一个SO问题,不是吗? - Boris Terzic

12

使用GtkBuilder替代Glade,它被整合到了Gtk中,而不是一个单独的库。

Glade的主要优点在于创建接口更加容易。连接信号处理程序需要一些额外的工作,但我从未觉得这很重要。


2
您还可以使用Glade创建可以通过GtkBuilder使用的文件。理论上是这样,因为Glade仍然会弄乱它们。最好的选择可能是使用Glade创建GUI,将其保存为glade文件,然后使用gtk-builder-convert进行转换。 - Torsten Marek
你使用的 Glade 版本是什么?最近几个版本都可以保存为 GtkBuilder 格式或 LibGlade 格式。因此,您不需要使用 gtk-builder-convert。 - Isaiah
事实上,“gtk-builder-convert”将无法处理由“glade-3”生成的GtkBuilder格式,因此您知道您已经具备兼容性。 - new123456

5

我最初使用了 Glade,但很快就转而采用纯代码编写。Glade 对于简单的事情很好用,当你学习 GTK 如何组织小部件(如何打包等)时也是很有帮助的。然而,完全通过代码构建你有更多的灵活性。此外,你不必依赖 Glade。


5

Glade非常有用,可以轻松创建界面,这意味着你不需要进行太多编码就能轻松更改GUI。但是如果你想做任何有用的事情(例如构建一个树视图),你必须熟悉GTK文档的各个部分 - 实际上找到一个好的教程/示例。


4

如果你正在编写一个传统的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定义目录(一组小部件),以便您可以轻松添加自己的自定义小部件。


4

我通常从Glade开始,直到遇到需要的功能不支持,例如创建向导。只要我使用Glade提供的标准小部件,就没有理由手动编写GUI。

我越熟悉Glade格式化代码的方式,我的手动编码就越好。更不用说,使用Glade制作底层框架非常容易,这样您就不必担心所有的初始化问题。


3

首先,需要正确看待这个问题。

您将使用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是注定要失败的。


1
离题的回答,但我很喜欢它,因为它非常详尽。不幸的是,我无法确认其准确性。 - tshepang
3
谢谢。我猜这是在挑起争端,就像批评Gnome一样。 - Charles Merriam

2

我建议在快速开发时使用Glade,但不适合学习。为什么呢?因为有时您需要调整一些小部件以使其按照您的意愿工作,如果您不真正了解每个小部件的属性,则可能会遇到麻烦。


1

对于快速简单的屏幕,我使用Glade。但对于需要更精细控制的任何内容,我会为实际需要创建自定义类(这很重要,因为很容易被概括性的东西带偏)。

通过使用瘦应用程序特定类,我可以从一个地方快速更改整个应用程序的外观和感觉。就像使用CSS来维护网站的一致性一样。


1

个人而言,我建议编写代码而不是使用Glade。我仍在学习Python和PyGtk,但我会说手动编写UI让我对底层的工作原理有了很多了解。

一旦你学会了它,我建议尝试使用Glade或其他UI设计工具,但一定要先学会“困难”的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接