关于python:Glade还是没有空地:使用PyGtk的最佳方法是什么?

关于python:Glade还是没有空地:使用PyGtk的最佳方法是什么?

Glade or no glade: What is the best way to use PyGtk?

我已经学习Python一段时间了,并且取得了一些成功。 我什至设法使用PyGtk + Glade创建一个或两个(简单)程序。

问题是:我不确定将GTK与python一起使用的最佳方法是否是通过使用Glade构建接口。

我想知道我们中经验丰富的人(请记住,我只是一个初学者)是否可以指出使用Glade而不是在代码本身中创建所有内容的好处和注意事项(假设学习正确的gtk绑定不会 完全是个问题)。


我会说这取决于:如果您发现使用Glade可以构建想要或需要制作的应用程序,那绝对没问题。但是,如果您实际上想学习GTK的工作方式,或者您有一些非标准的UI要求,则必须深入研究GTK的内部结构(这并不那么复杂)。

就个人而言,当我需要某些功能或自定义功能(通常无法通过Glade或Stetic等设计师实现)时,通常需要大约5分钟才能进入富客户端。也许就是我。尽管如此,使用图形工具引导窗口设计对我仍然有用。

我的建议:如果使用GTK来吸引富客户将是您工作/爱好的重要组成部分,那么也要学习GTK,因为您有一天需要编写该代码。

附言我个人认为Stetic在稳定性方面要优于Glade。


使用GtkBuilder而不是Glade,它已集成到Gtk本身而不是单独的库中。

Glade的主要好处是创建界面非常容易。连接信号处理程序还需要做更多的工作,但是我从来没有觉得这很重要。


我开始使用林间空地,但很快就开始使用代码做所有事情。 Glade非常适合简单的事情,当您学习GTK如何组织小部件(事物如何包装等)时,它非常有用。但是,用代码构造所有内容,您将拥有更大的灵活性。另外,您没有林间空依赖。


Glade对于创建界面非常有用,这意味着您无需进行大量编码即可轻松更改GUI。您会发现,如果您想做任何有用的事情(例如,构建树状视图),则必须熟悉GTK文档的各个部分-在实践中找到一个不错的教程/示例。


如果您正在编写一个传统的GUI应用程序,该应用程序重用了GTK +中的许多标准组件(按钮,标签,容器等),那么我个人将使用Glade + Kiwi(用于构建GTK + GUI应用程序的便捷框架)。

使用Glade的最大优势是可以大大减少布局/打包代码。这是一个非常简单的示例,已经显示了手动布置GUI(不使用任何辅助函数)的问题:

1
2
3
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制作底层框架确实很容易,因此您不必担心所有初始化。


我建议使用Glade进行快速开发,而不是学习。为什么?因为有时您需要调整一些小部件以使其按您希望的方式工作,并且如果您不真正了解/理解每个小部件的属性,那么您将遇到麻烦。


首先,开始着眼于这一点。

您将使用GTK。这是一个巨大的C库,它使用1993年代的最佳传统在1993年构建。它是为帮助实现GIMP而设计的,GIMP是Photoshop的竞争者,希望与传奇的用户界面相提并论。一个典型的gui字段可能具有40个或更多参数,大多数是重复的,具有getter和setter。会有痛苦。

GTK本身使用GObject在C中管理完整的动态类型系统。这使调试特别有趣,它需要手动遍历指向带有隐式继承的泛型参数列表的方法的指针数组。您最不希望看到Pango库时,也将在其中跳转,例如,使用Pango常量来查找页面较小时省略号在标签中的位置。期待更多的痛苦。

到目前为止,您可能已经准备将所有GTK交互包装在特定于您的应用程序的模型-视图-控制器体系结构中。很好

使用Glade或gtkBuilder或Stetic将帮助解决40个参数与函数的巨大耦合问题。 Glade提供了一个基本的GUI构建器来将组件拖放在一起。参数和继承的参数有些分离。 Glade的输出是.glade XML文件,您将随后阅读该文件,将回调("信号处理程序")附加到同名函数,并查询或更新该XML的内存版本以获取小部件,然后使用pyGTK操纵。 Glade本身是一个吱吱作响的地方,维护得不好。

使用pyGTK可以使您烦恼地进行细粒度的控制,以构建您的GUI。这将是冗长的复制粘贴代码。每个属性将是一个单独的函数调用。属性设置器不返回任何内容,因此将调用链接起来是不可能的。通常,您的IDE将仅对功能的含义提供很少的帮助,并且您将不断引用DevHelp或其他工具。

几乎可以预期GTK GUI将会失败。


我个人建议将其编码而不是使用Glade。我仍在学习python和pyGtk,但我要说的是,手工编写UI可以让我对幕后工作原理有很多了解。

一旦您了解了,我会说给林间空地或其他UI设计师试一试,但一定要先学习如何以"硬"方式进行操作。


对于快速简单的屏幕,我使用Glade。但是对于任何需要更好控制级别的东西,我都会根据自己的实际需要创建一个自定义类(这很重要,因为很容易被泛化所笼罩)。

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


您可以使用glade-2进行设计,并使用glade2py.py生成纯pygtk代码,
它使用pygtkcompat支持gtk3


推荐阅读