65.9K
CodeProject 正在变化。 阅读更多。
Home

使用Gtk#的Google搜索应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.49/5 (16投票s)

2005 年 1 月 14 日

8分钟阅读

viewsIcon

254259

downloadIcon

1145

一个(基于 Gtk#)使用 Google Web 服务搜索互联网的应用程序。

Sample Image - googleSearch.jpg

引言

GTK(GIMP Toolkit)是一个用于创建图形用户界面的库。它使用 LGPL 许可证,因此您可以使用 GTK 开发开源软件、免费软件,甚至是商业非免费软件,而无需花费任何许可费或版税。Gtk# 是 Mono 对这个伟大工具包的绑定,可供包括 MonoBasic 和 C# 在内的任何 Mono 语言使用。在 Windows 上也有针对 .NET Framework v1.1 的绑定。

GTK 可以安装在 Windows 和 Linux 上,尽管 Linux 版本比 Windows 版本稍微快一些,也更稳定。我将展示如何使用 .NET 和 Gtk# 创建一个跨平台应用程序。这里描述的开发环境基于 Windows。但是,您也可以使用 Linux 作为开发环境。

该应用程序将使用 Google Web 服务执行互联网搜索。首先,您需要有一个 Google 开发者帐户。如果您没有帐户,可以在 https://www.google.com/accounts/NewAccount 创建一个。

创建帐户后,您将收到一个来自 Google 的许可证密钥,它是一个 32 字节的字母数字字符串,例如:0AdaQ5lQFHJmWhI5UACEjtgIcwRezTJ5。请妥善保管,因为每次调用 Google Web 服务时都需要它。

开发环境(Windows)

Windows 上 Gtk# 应用程序的开发环境包括以下内容:

  1. Visual Studio .NET 2003(IDE)
  2. Gtk#(跨平台 UI 工具包)
  3. Glade(UI 设计器)

(如果您没有 Visual Studio,也可以使用 SharpDevelop。您可以选择使用 .NET Framework v1.1 进行开发,或者将您的 Visual Studio 配置为使用 Mono。)

生成的 .exe 文件可以直接在安装了 Mono 和 Gtk# 的 Linux 工作站上运行。它们也可以在安装了 .NET Framework 1.1(或 Mono)和 Gtk# 的任何 Windows 工作站上运行。

注意:您只需要在开发机器上安装 Glade。

设置开发环境(Windows)

  1. 安装 Gtk#

    Gtk# 主页 http://gtk-sharp.sourceforge.net/ 包含一个 win32 安装程序的链接。下载并安装。网站上有两个版本 - v1.0.2.4 和 v1.9.1.0。我试用了 v1.0.2.4,它运行完美,尽管后者版本也应该可以工作。
  2. 安装 Glade

    http://gladewin32.sourceforge.net/ 下载并安装 Glade。您还需要从同一个网站下载并安装 Gtk+ 运行时。

开发环境(Linux)


Windows 上 Gtk# 应用程序的开发环境包括以下内容:

  1. MonoDevelop(IDE)
  2. Gtk#(跨平台 UI 工具包)
  3. Glade(UI 设计器)

生成的 .exe 文件可以直接在安装了 Mono 和 Gtk# 的 Linux 工作站上运行。它们也可以在安装了 .NET Framework 1.1(或 Mono)和 Gtk# 的任何 Windows 工作站上运行。

注意:您只需要在开发机器上安装 Glade。

设置开发环境(Linux)

  1. 安装 MonoDevelop

    请参考其网站 http://www.monodevelop.com/ 上的安装说明。
  2. 安装 Gtk#

    说明可能因您运行的 Linux 版本而异。请参考 http://gtk-sharp.sourceforge.net/ 上的说明。
  3. 安装 Glade

    请参考 http://glade.gnome.org/ 获取最新版本和安装说明。

概述

现在您已经设置好了开发平台,我将解释各种组件以及它们如何相互作用。Glade 是一个点击拖拽式的 UI 设计器。它用于创建应用程序的用户界面。一旦用户界面完成,它就会将 UI 保存为 XML 文件。此 XML 文件由 .NET(或 Mono)应用程序在运行时使用来构建用户界面。该应用程序使用 Gtk# 和 Glade# 库(Glade# 与 Gtk# 一起打包)来读取 XML 并创建 UI。

构建界面

第一步是构建用户界面。打开 Glade。如果您在桌面上找不到它,它应该在 C:\Program Files\Gtk\bin 中。

您应该会看到 3 个窗口打开。

Glade

在 Palette 窗口中单击窗口图标。将创建一个窗口。

Glade window

使用 Properties 对话框更改窗口属性。将 Window name 设置为 mainWindow,Title 设置为“Gtk# - Google Search”。您还应该设置默认宽度和高度。

Glade Properties

接下来,单击垂直框按钮( vertical)并在窗口中单击。在提示时选择 2 行。

Glade

您的窗口现在将分为 2 个部分。

Glade

为了给文本框和按钮腾出空间,单击水平框( Horizontal )并在您之前创建的垂直框的上半部分单击。在提示时选择 3 列。

Sample screenshot

在窗口上半部分的三个列中,添加一个文本输入框和两个按钮。完成后,您的界面应该如下所示。

Sample screenshot

现在右键单击窗口的上半部分,然后选择 hbox->select。更改其 Packing 属性,以便 Expand Fill 为“No”。

Sample screenshot

单击窗口中的 button1,并将其 Name 属性更改为 btnSearch,Label 更改为 Search,Icon 属性更改为 Find。

Sample screenshot

单击窗口中的 button2,并将其 Name 属性更改为 btnClear,Label 更改为 Clear,Icon 属性更改为 Clear。

Sample screenshot

现在您的窗口应该如下所示。

Sample screenshot

现在您只需要添加一个搜索结果框。在窗口的下半部分添加一个文本视图组件。此时,界面应该如下所示。

Sample screenshot

现在保存界面

Sample screenshot

在保存选项中,您可以忽略“C Options”选项卡和“LibGlade Options”选项卡。这样就完成了您的 UI 设计。接下来,您将把代码与用户界面关联起来。

编码

启动您的 Visual Studio 2003 并创建一个新的空白 C# 项目。将其命名为 googleSearch。

添加对以下程序集的引用:atk-sharp、gtk-sharp、gdk-sharp、glade-sharp、glib-sharp。在项目属性中,将 Output Type 设置为“Windows Application”。


将 googleSearch.glade 添加到项目中。在解决方案资源管理器中右键单击文件名,并将 Build Action 属性更改为“Embedded Resource”。这确保该文件被嵌入到编译项目生成的 .exe 文件中。

让我们为 Google Web 服务添加一个 Web 引用。在解决方案资源管理器中右键单击 References,然后选择添加新的 Web 引用。输入 URL http://api.google.com/GoogleSearch.wsdl 并按 Go。您应该会看到以下屏幕。

Adding web sreference in Visual Studio

按 Add Reference。这将创建连接到 Google Web 服务所需的类。(如果您不使用 Visual Studio,可以使用 wsdl.exe 命令行程序完成相同的操作,该程序是 .NET Framework SDK 的一部分,可以在 C:\Program Files\Microsoft.NET\SDK\v1.1\Bin 中找到。)

添加一个名为 GtkApp.cs 的新类。

using System;
using Gtk;
using Glade;
using googleSearch.com.google.api;

namespace googleSearch
{
 /// <summary>
 /// Summary description for GtkApp.
 /// </summary>
 public class GtkApp
 {
  
  [Widget]Window mainWindow;
  [Widget]Button btnSearch;
  [Widget]Button btnClear;
  [Widget]Entry entry1;
  [Widget]TextView textview1;

  /* Main Function */
  public static void Main (string[] args)
  {
   new GtkApp (args);
  }


  public GtkApp(string []args)
  {
   Application.Init();

   Glade.XML gxml = new Glade.XML (null, "googleSearch.googlesearch.glade", 
                                  "mainWindow", null);
   gxml.Autoconnect (this);
   mainWindow.DeleteEvent+=new DeleteEventHandler(mainWindow_DeleteEvent);
   btnSearch.Clicked+=new EventHandler(btnSearch_Clicked);
   btnClear.Clicked+=new EventHandler(btnClear_Clicked);
   Application.Run();
  }

  private void mainWindow_DeleteEvent(object o, DeleteEventArgs args)
  {
   Application.Quit ();
   args.RetVal = true;
  }

  private void btnSearch_Clicked(object sender, EventArgs e)
  {
   try
   {
    textview1.Buffer.Text="";

    //do search
    GoogleSearchService svc=new GoogleSearchService();
    GoogleSearchResult result
          =svc.doGoogleSearch("FEkTsl8kwgQtrQIeGHJDSELrTtjNcp1eC",
                               entry1.Text,0,10,true,"",true,"","","");
   
    foreach(ResultElement re in result.resultElements)
    {
     textview1.Buffer.Text+="Title: "+re.title+"\r\n";
     textview1.Buffer.Text+="Summary: "+re.summary+"\r\n";
     textview1.Buffer.Text+="URL: "+re.URL+"\r\n";
     textview1.Buffer.Text+="==========================\r\n\r\n";
    }

   }
   catch(Exception ex)
   {
    Gtk.MessageDialog md=new MessageDialog(mainWindow,Gtk.DialogFlags.Modal,
                        Gtk.MessageType.Error,Gtk.ButtonsType.Ok,ex.Message);
    md.Show();
   }
  }

  private void btnClear_Clicked(object sender, EventArgs e)
  {
   textview1.Buffer.Text="";
   entry1.Text="";
  }

  
 }
}

现在构建并启动项目。您应该会看到一个如下所示的窗口。

Sample screenshot

在文本框中输入一些词语,然后按 Search。您将看到 Google 返回的搜索结果。

现在我将介绍代码中一些更重要的部分。

[Widget]Window mainWindow;

此行定义 mainWindow 为 Gtk.Window 类型。名称必须与 Glade 中定义的名称匹配。其余声明也一样。

Application.Init();

此行初始化 Gtk 应用程序。

Glade.XML gxml = new Glade.XML (null, "googleSearch.googlesearch.glade", 
                               "mainWindow", null);
gxml.Autoconnect (this);

此行加载 XML 文件 googlesearch.glade,并将 mainWindow 定义为根元素。Autoconnect 调用将控件名称与前面所做的声明链接起来。例如,类声明中定义的 mainWindow 变量与 googlesearch.glade 文件中定义的 mainWindow 相关联。

mainWindow.DeleteEvent+=new DeleteEventHandler(mainWindow_DeleteEvent);
btnSearch.Clicked+=new EventHandler(btnSearch_Clicked);
btnClear.Clicked+=new EventHandler(btnClear_Clicked);

这些行定义了各种事件的事件处理程序。无需手动定义事件。您实际上可以使用 Glade 来定义事件处理程序。在这种情况下,当调用 Autoconnect 时,它会自动将事件与事件处理程序链接起来。

Application.Run();

此行启动 Gtk 应用程序。

GoogleSearchResult result
      = svc.doGoogleSearch("FEkTsl8kwgQtrQIeGHJDSELrTtjNcp1eC",
                          entry1.Text,0,10,true,"",true,"","","");

这将调用 Google Web 服务。结果包含搜索结果。第一个参数是您的许可证密钥,您应该已经按照本文前面的说明从 Google 获得了该密钥。

要在 Linux 上运行此程序,只需将项目重新编译为 Release,然后将 bin\Release 文件夹中的 googleSearch.exe 文件复制到 Linux 机器。在 shell 提示符下键入

# mono googleSearch.exe

这应该会启动程序。当然,您的 Linux 机器上必须安装了 mono 和 gtk-sharp。

跨平台开发的一些技巧

  1. 有些命名空间应尽可能避免使用,因为 Mono 尚未完全支持它们。

    Microsoft.Win32
    System.Windows.Forms
    System.Messaging
  2. 在命名文件时使用相对路径。文件 C:\Program Files\yourapplication 在 Linux 上不存在,而 Windows 下没有 /usr/lib/。还要记住,Linux 文件名是区分大小写的,而 Windows 不区分。
  3. 避免使用特定于平台的资源,例如 Windows 注册表(Microsoft.Win32.Registry)。
  4. 使用 Gtk# 构建应用程序。Windows 上的 Gtk# 比 Linux 上的 System.Windows.Forms 更好。
  5. 仅在您确实需要时使用 Platform Invoke (P/Invoke)。如果可能,请使用在 UNIX 和 Windows 上都可用的库。
  6. Mono 不支持增量调试生成,Visual Studio 为了加快编译速度而广泛使用它。在将 Visual Studio 中创建的文件部署到 Linux 时,请进行 Rebuild as Release。
  7. 避免使用 Visual Basic .NET,因为 Mono 中对其的支持仍处于 beta 阶段。

结论

这希望能为您介绍如何在 .NET 中使用 Gtk# 的基本知识。有关更多详细信息、API 列表等,请查看参考部分。Gtk# API 非常接近 Gtk API,因为它主要是 Gtk 的包装器。因此,您可以将 Gtk API 本身作为参考。有关使用 Gtk# 的更多教程,请参阅 Mono Handbook。

参考文献

  1. Mono Handbook http://monohandbook.monoforge.com/monkeyguide/index.html
  2. MonoWiki http://www.nullenvoid.com/mono/wiki/
  3. Glade# for Rapid Development http://primates.ximian.com/~edasque/projects/Tutorial/glade2.html
  4. Glade Tutorial http://www.kplug.org/glade_tutorial/glade2_tutorial/glade2_introduction.html
  5. GTK Tutorial https://gtk.org.cn/tutorial/
© . All rights reserved.