高兴还是不高兴:使用PyGtk的最佳方法是什么?

时间:2020-03-05 18:48:52  来源:igfitidea点击:

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

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

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

解决方案

回答

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

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

回答

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

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

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

P.S.我个人认为Stetic在设计工作上要优于Glade,即使不稳定一点。

回答

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

回答

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

回答

我通常从Glade开始,直到出现无法提供所需功能的地步,例如创建一个向导。只要我使用Glade提供的标准小部件,实际上就没有理由手工编写GUI。

我对Glade格式化代码的方式越满意,我的手动编码就越好。更不用说,使用Glade制作底层框架确实很容易,因此我们不必担心所有初始化。

回答

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

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

回答

我建议使用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。我仍在学习python和pyGtk,但我要说的是,手工编写UI可以使我对幕后工作原理有很多了解。

一旦掌握了该知识,我就会说要尝试林间空地或者其他UI设计师,但一定要先学习如何以"艰苦"的方式来做到这一点。

回答

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

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

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

到目前为止,我们可能已经准备将所有GTK交互包装在特定于应用程序的Model-View-Controller架构中。很好

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

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

人们几乎会期望GTK GUI会失败。