本系列文章探究了如何使用 Python 来为 GNOME 桌面、screenlet 框架和 Nautilus 创建脚本,进而提供高生产率环境。桌面上的脚本启用拖放功能,可快速访问您经常使用的信息和服务。本期我们将了解如何使用 screenlet 小部件工具包构建桌面应用程序。
为 Linux 桌面开发应用程序通常需要一些类型的图形用户界面(Graphical User Interface,GUI)框架作为构建基础。选项包括针对 GNOME 桌面的 GTK+,和针对 K 桌面环境(K Desktop Environment,KDE)的 Qt。这两个平台提供了开发人员构建 GUI 应用程序所需的一切,包括库和布局工具以便创建用户看到的窗口。本文向您展示如何基于 screenlet 小部件工具包构建桌面生产率应用程序。
一些现有的应用程序将归为桌面生产率类别,包括 GNOME Do 和 Tomboy。这些应用程序通常允许用户直接从桌面与它们进行交互,方法为通过特定的键组合或从另一个应用程序(如 Mozilla Firefox)进行拖放。Tomboy 用作桌面笔记工具,支持从其他窗口拖放文本。
Screenlet 入门
您需要安装一些程序以便开始开发 screenlet。首先,使用 Ubuntu 软件中心或命令行安装 screenlets 包。在 Ubuntu 软件中心内,在 Search框中键入 screenlets。您应该看到主要程序包和文档的独立安装包两个选项。
Python 和 Ubuntu您可使用 Python 对 screenlet 编程。Ubuntu 10.04 的基本安装已包含了 Python 2.6,因为许多实用程序都依赖它。您可能需要其他库,具体取决于您的应用程序要求。对于本文,我在 Ubuntu 10.04 上安装并测试了一切。下一步,从 screenlets.org 站点下载测试 screenlet 源代码。测试 screenlet 位于 src/share/screenlets/Test 文件夹并使用 Cairo 和 GTK,这些也是需要您安装的。测试程序的整个源代码位于 TestScreenlet.py 文件中。在您最喜爱的编辑器中打开此文件来查看 screenlet 的基础结构。
Python 高度面向对象,因此使用 class关键字来定义对象。在本示例中,该类被命名为 TestScreenlet并具有一些已定义的方法。在 TestScreenlet.py 中,请注意下面代码中的第 42 行:
def __init__(self, **keyword_args):
Python 使用前后双下划线(__)符号,通过预定义行为识别系统函数。在本例中,__init__函数针对类的构造函数的所有的意图和目的,且包含将要在创建对象的新实例时执行的任何数量的初始化步骤。按照惯例,每个类方法的第一个参数都是对该类的当前实例的引用,并命名为 self。通过此行为,可以方便地使用 self来引用它所在的实例的方法和属性:
self.theme_name = "default"
Screenlet 框架定义了一些命名惯例和标准,在 screenlets.org 中的开发人员页面有概述。还有 screenlet 包的源代码以及应用程序编程接口(Application Programming Interface,API)文档的链接。查看代码还使您可以深入了解每一个函数可以通过调用参数做什么以及返回什么。
编写简单的 screenlet
Screenlet 的基本组成部分包括图标文件、源代码文件和主题文件夹。主题文件夹包含不同主题的附加文件夹。您将在 screenlets.org 上发现样例模板和帮助您入门所需的文件和文件夹。
对于第一个示例来说,使用已提供的模板来创建基本的 “Hello World” 应用程序,此基本应用程序的代码如清单 1 所示。
清单 1. Hello World screenlet 的 Python 代码
- #!/usr/bin/envpythonimportscreenletsclassHelloWorldScreenlet(screenlets.Screenlet):__name__='HelloWorld'__version__='0.1'__author__='JohnDoe'__desc__='SimpleHelloWorldScreenlet'def__init__(self,**kwargs):#Customizethewidthandheight.screenlets.Screenlet.__init__(self,width=180,height=50,**kwargs)defon_draw(self,ctx):#Changethecolortowhiteandfillthescreenlet.ctx.set_source_rgb(255,255,255)self.draw_rectangle(ctx,0,0,self.width,self.height)#Changethecolortoblackandwritethemessage.ctx.set_source_rgb(0,0,0)text='HelloWorld!'self.draw_text(ctx,text,10,10,"Sans9",20,self.width)if__name__=="__main__":importscreenlets.sessionscreenlets.session.create_session(HelloWorldScreenlet)
每一个应用程序都必须导入 screenlet 框架并创建新的会话,还有一些其他的最低要求,包括任何初始化步骤以及基本绘图函数,以便在屏幕上呈现小部件,TestScreenlet.py 示例具有用来初始化对象的 __init__方法。在本例中,您将看到一行,包含对 screenlet 的 __init__方法的调用,它设置要为此应用程序创建的窗口的初始宽度和高度。
此应用程序惟一需要的其他函数是 on_draw方法,此例程将框的背景颜色设置为白色,并使用先前定义的维度绘制矩形,它将文本颜色设置为黑色,将源文本设置为 “Hello World!”,然后再绘制该文本,图 1 显示了在运行此 screenlet 时您应该看到什么。在文本的后面部分,您在这些简单块上创建更有用的应用程序时,此基本结构一直存在。