原文: http://zetcode.com/gui/javascriptgtktutorial/menustoolbars/

在 JavaScript GTK 编程教程的这一部分中,我们将使用菜单和工具栏。

菜单栏是 GUI 应用中最常见的部分之一。 它是位于各个菜单中的一组命令。 在控制台应用中,您必须记住所有这些神秘命令,在这里,我们将大多数命令分组为逻辑部分。 这些公认的标准可进一步减少学习新应用的时间。

简单菜单

在第一个示例中,我们将创建一个带有一个文件菜单的菜单栏。 该菜单将只有一个菜单项。 通过选择项目,应用退出。

  1. #!/usr/bin/seed
  2. /*
  3. ZetCode JavaScript GTK tutorial
  4. This example shows a simple menu.
  5. author: Jan Bodnar
  6. website: www.zetcode.com
  7. last modified: July 2011
  8. */
  9. Gtk = imports.gi.Gtk;
  10. Gdk = imports.gi.Gdk;
  11. Gtk.init(null, null);
  12. Example = new GType({
  13. parent: Gtk.Window.type,
  14. name: "Example",
  15. init: function ()
  16. {
  17. init_ui(this);
  18. function init_ui(w) {
  19. w.signal.hide.connect(Gtk.main_quit);
  20. w.set_default_size(250, 200);
  21. w.set_title("Simple menu");
  22. w.set_position(Gtk.WindowPosition.CENTER);
  23. w.modify_bg(Gtk.StateType.NORMAL,
  24. new Gdk.Color({red:6400, green:6400, blue:6440}));
  25. var mb = new Gtk.MenuBar();
  26. var filemenu = new Gtk.Menu();
  27. var filem = new Gtk.MenuItem.with_label("File");
  28. filem.set_submenu(filemenu);
  29. var exitmu = new Gtk.MenuItem.with_label("Exit");
  30. exitmu.signal.activate.connect(Gtk.main_quit);
  31. filemenu.append(exitmu);
  32. mb.append(filem);
  33. vbox = new Gtk.VBox.c_new(false, 2);
  34. vbox.pack_start(mb, false, false, 0);
  35. w.add(vbox);
  36. w.show_all();
  37. }
  38. }
  39. });
  40. var window = new Example();
  41. Gtk.main();

这是一个最小的菜单栏功能示例。

  1. var mb = new Gtk.MenuBar();

MenuBar小部件已创建。 这是菜单的容器。

  1. var filemenu = new Gtk.Menu();
  2. var filem = new Gtk.MenuItem.with_label("File");
  3. filem.set_submenu(filemenu);

创建顶层MenuItem

  1. var exitmu = new Gtk.MenuItem.with_label("Exit");
  2. exitmu.signal.activate.connect(Gtk.main_quit);
  3. filemenu.append(exitmu);

将创建出口MenuItem,并将其附加到文件MenuItem中。

  1. mb.append(filem);

顶级MenuItem被附加到MenuBar小部件。

  1. vbox = new Gtk.VBox.c_new(false, 2);
  2. vbox.pack_start(mb, false, false, 0);

与其他工具包不同,我们必须自己照顾菜单栏的布局管理。 我们将菜单栏放入垂直框中。

JavaScript GTK 中的菜单和工具栏 - 图1

图:简单菜单

子菜单

我们的最后一个示例演示了如何创建子菜单。 子菜单是另一个菜单中的菜单。

  1. #!/usr/bin/seed
  2. /*
  3. ZetCode JavaScript GTK tutorial
  4. This example shows a submenu.
  5. author: Jan Bodnar
  6. website: www.zetcode.com
  7. last modified: July 2011
  8. */
  9. Gtk = imports.gi.Gtk;
  10. Gdk = imports.gi.Gdk;
  11. Gtk.init(null, null);
  12. Example = new GType({
  13. parent: Gtk.Window.type,
  14. name: "Example",
  15. init: function ()
  16. {
  17. init_ui(this);
  18. function init_ui(w) {
  19. w.signal.hide.connect(Gtk.main_quit);
  20. w.set_default_size(250, 200);
  21. w.set_title("Submenu");
  22. w.set_position(Gtk.WindowPosition.CENTER);
  23. w.modify_bg(Gtk.StateType.NORMAL,
  24. new Gdk.Color({red:6400, green:6400, blue:6440}));
  25. var mb = new Gtk.MenuBar();
  26. var filemenu = new Gtk.Menu();
  27. var filem = new Gtk.MenuItem.with_label("File");
  28. filem.set_submenu(filemenu);
  29. mb.append(filem);
  30. var imenu = new Gtk.Menu();
  31. var importm = new Gtk.MenuItem.with_label("Import");
  32. importm.set_submenu(imenu);
  33. var inews = new Gtk.MenuItem.with_label("Import news feed...");
  34. var ibookmarks = new Gtk.MenuItem.with_label("Import bookmarks...");
  35. var imail = new Gtk.MenuItem.with_label("Import mail...");
  36. imenu.append(inews);
  37. imenu.append(ibookmarks);
  38. imenu.append(imail);
  39. filemenu.append(importm);
  40. var emi = new Gtk.MenuItem.with_label("Exit");
  41. emi.signal.activate.connect(Gtk.main_quit);
  42. filemenu.append(emi);
  43. var vbox = new Gtk.VBox.c_new(false, 2);
  44. vbox.pack_start(mb, false, false, 0);
  45. w.add(vbox);
  46. w.show_all();
  47. }
  48. }
  49. });
  50. var window = new Example();
  51. Gtk.main();

在此示例中,我们创建一个子菜单。

  1. var imenu = new Gtk.Menu();

子菜单是Menu

  1. var importm = new Gtk.MenuItem.with_label("Import");
  2. importm.set_submenu(imenu);

它是菜单项的子菜单,它会登录到顶级文件菜单。

  1. var inews = new Gtk.MenuItem.with_label("Import news feed...");
  2. var ibookmarks = new Gtk.MenuItem.with_label("Import bookmarks...");
  3. var imail = new Gtk.MenuItem.with_label("Import mail...");
  4. imenu.append(inews);
  5. imenu.append(ibookmarks);
  6. imenu.append(imail);

子菜单有其自己的菜单项。

JavaScript GTK 中的菜单和工具栏 - 图2

图:子菜单

图像菜单

在下一个示例中,我们将进一步探索菜单。 我们将图像和加速器添加到我们的菜单项中。 加速器是用于激活菜单项的键盘快捷键。

  1. #!/usr/bin/seed
  2. /*
  3. ZetCode JavaScript GTK tutorial
  4. In this example, we explore image menu
  5. items, a separator, accelerators.
  6. author: Jan Bodnar
  7. website: www.zetcode.com
  8. last modified: July 2011
  9. */
  10. Gtk = imports.gi.Gtk;
  11. Gdk = imports.gi.Gdk;
  12. Gtk.init(null, null);
  13. Example = new GType({
  14. parent: Gtk.Window.type,
  15. name: "Example",
  16. init: function ()
  17. {
  18. init_ui(this);
  19. function init_ui(w) {
  20. w.signal.hide.connect(Gtk.main_quit);
  21. w.set_default_size(250, 200);
  22. w.set_title("Image menu");
  23. w.set_position(Gtk.WindowPosition.CENTER);
  24. w.modify_bg(Gtk.StateType.NORMAL,
  25. new Gdk.Color({red:6400, green:6400, blue:6440}));
  26. var mb = new Gtk.MenuBar();
  27. var filemenu = new Gtk.Menu();
  28. var filem = new Gtk.MenuItem.with_label("File");
  29. filem.set_submenu(filemenu);
  30. var agr = new Gtk.AccelGroup();
  31. w.add_accel_group(agr);
  32. var newi = new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_NEW, agr);
  33. newi.signal.activate.connect(function() {print("new")});
  34. filemenu.append(newi);
  35. var openm = new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_OPEN, agr);
  36. filemenu.append(openm);
  37. var sep = new Gtk.SeparatorMenuItem();
  38. filemenu.append(sep);
  39. var exitmu = new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_QUIT, agr);
  40. exitmu.signal.activate.connect(Gtk.main_quit);
  41. filemenu.append(exitmu);
  42. mb.append(filem);
  43. var vbox = new Gtk.VBox.c_new(false, 2);
  44. vbox.pack_start(mb, false, false, 0);
  45. w.add(vbox);
  46. w.show_all();
  47. }
  48. }
  49. });
  50. var window = new Example();
  51. Gtk.main();

我们的示例显示了具有三个子菜单项的顶级菜单项。 每个菜单项都有一个图像和一个加速器。 退出菜单项的加速器退出应用。 新菜单项的加速器将"new"打印到控制台。

  1. var agr = new Gtk.AccelGroup();
  2. w.add_accel_group(agr);

要使用加速器,我们创建一个全局AccelGroup对象。 稍后将使用。

  1. var newi = new Gtk.ImageMenuItem.from_stock(Gtk.STOCK_NEW, agr);
  2. newi.signal.activate.connect(function() {print("new")});
  3. filemenu.append(newi);

ImageMenuItem已创建。 图片来自图片库。 自动创建 Ctrl + N 加速器。 我们将匿名方法插入菜单项。 它将消息打印到控制台。

  1. var sep = new Gtk.SeparatorMenuItem();
  2. filemenu.append(sep);

这些行创建一个分隔符。 它用于将菜单项放入逻辑组。

JavaScript GTK 中的菜单和工具栏 - 图3

图:图像 menu

菜单将我们可以在应用中使用的命令分组。 使用工具栏可以快速访问最常用的命令。

简单的工具栏

接下来,我们创建一个简单的工具栏。 工具栏提供对应用最常用功能的快速访问。

  1. #!/usr/bin/seed
  2. /*
  3. ZetCode JavaScript GTK tutorial
  4. In this example, we create a simple
  5. toolbar.
  6. author: Jan Bodnar
  7. website: www.zetcode.com
  8. last modified: July 2011
  9. */
  10. Gtk = imports.gi.Gtk;
  11. Gtk.init(null, null);
  12. Example = new GType({
  13. parent: Gtk.Window.type,
  14. name: "Example",
  15. init: function ()
  16. {
  17. init_ui(this);
  18. function init_ui(w) {
  19. w.signal.hide.connect(Gtk.main_quit);
  20. w.set_default_size(250, 200);
  21. w.set_title("Toolbar");
  22. w.set_position(Gtk.WindowPosition.CENTER);
  23. var toolbar = new Gtk.Toolbar();
  24. toolbar.set_style(Gtk.ToolbarStyle.ICONS);
  25. var newtb = new Gtk.ToolButton.from_stock(Gtk.STOCK_NEW);
  26. var opentb = new Gtk.ToolButton.from_stock(Gtk.STOCK_OPEN);
  27. var savetb = new Gtk.ToolButton.from_stock(Gtk.STOCK_SAVE);
  28. var sep = new Gtk.SeparatorToolItem();
  29. var quittb = new Gtk.ToolButton.from_stock(Gtk.STOCK_QUIT);
  30. toolbar.insert(newtb, 0);
  31. toolbar.insert(opentb, 1);
  32. toolbar.insert(savetb, 2);
  33. toolbar.insert(sep, 3);
  34. toolbar.insert(quittb, 4);
  35. quittb.signal.clicked.connect(Gtk.main_quit);
  36. var vbox = new Gtk.VBox.c_new(false, 2);
  37. vbox.pack_start(toolbar, false, false, 0);
  38. w.add(vbox);
  39. w.show_all();
  40. }
  41. }
  42. });
  43. var window = new Example();
  44. Gtk.main();

该示例显示了一个工具栏和四个工具按钮。

  1. var toolbar = new Gtk.Toolbar();

Toolbar小部件已创建。

  1. toolbar.set_style(Gtk.ToolbarStyle.ICONS);

在工具栏上,我们仅显示图标。 没有文字。

  1. var newtb = new Gtk.ToolButton.from_stock(Gtk.STOCK_NEW);

创建带有库存图像的ToolButton。 该图像来自图像的内置库存。

  1. var sep = new Gtk.SeparatorToolItem();

这是一个分隔符。 它可用于将工具栏按钮放入逻辑组。

  1. toolbar.insert(newtb, 0);
  2. toolbar.insert(opentb, 1);
  3. ...

工具栏按钮插入到工具栏小部件中。 insert()方法的第一个参数是工具按钮。 第二个是工具栏上的位置。

JavaScript GTK 中的菜单和工具栏 - 图4

图:工具栏

在 JavaScript GTK 教程的这一章中,我们展示了如何使用菜单和工具栏。