菜单&工具条
这部分的Ruby GTK教程我们将使用菜单和工具条。
菜单栏是GUI应用中最常用的部分之一。它是位于各个菜单的一组命令。在命令行应用程序中我们需要记住这些所有神秘的命令,而现在我们将这些大部分的命令按照逻辑归合在一起。接受这些标准将进一步减少在学习新应用上花费的时间。
简单的菜单
我们的第一个例子将创建一个有文件菜单的菜单栏。这个菜单只有一个菜单项,选择这一项将退出应用。
#!/usr/bin/ruby
# ZetCode Ruby GTK tutorial
#
# This example shows a simple menu
#
# author: jan bodnar
# website: www.zetcode.com
# last modified: June 2009
require ‘gtk2’
class RubyApp < Gtk::Window
def initialize
super
set_title “Simple menu”
signal_connect “destroy” do
Gtk.main_quit
end
init_ui
set_default_size 250, 200
set_window_position Gtk::Window::POS_CENTER
show_all
end
def init_ui
modify_bg Gtk::STATE_NORMAL, Gdk::Color.new(6400, 6400, 6440)
mb = Gtk::MenuBar.new
filemenu = Gtk::Menu.new
filem = Gtk::MenuItem.new “File”
filem.set_submenu filemenu
exit = Gtk::MenuItem.new “Exit”
exit.signal_connect “activate” do
Gtk.main_quit
end
filemenu.append exit
mb.append filem
vbox = Gtk::VBox.new false, 2
vbox.pack_start mb, false, false, 0
add vbox
end
end
Gtk.init
window = RubyApp.new
Gtk.main
这是一个最小功能的菜单栏的例子。
mb = Gtk::MenuBar.new
创建MenuBar控件,这是菜单的容器。
filemenu = Gtk::Menu.new
filem = Gtk::MenuItem.new “File”
filem.set_submenu filemenu
创建顶级菜单项。
exit = Gtk::MenuItem.new “Exit”
exit.signal_connect “activate” do
Gtk.main_quit
end
filemenu.append exit
创建退出菜单项并添加到文件菜单项中。
mb.append filem
将顶级菜单项添加到菜单栏控件中。
vbox = Gtk::VBox.new false, 2
vbox.pack_start mb, false, false, 0
与其他套件不同,我们必须要自己处理菜单栏的布局。我们将菜单栏放入竖直盒子中。
图片:简单的菜单
子菜单
最后展示如何创建一个子菜单。
#!/usr/bin/ruby
# ZetCode Ruby GTK tutorial
#
# This example shows a submenu
#
# author: jan bodnar
# website: www.zetcode.com
# last modified: June 2009
require ‘gtk2’
class RubyApp < Gtk::Window
def initialize
super
set_title “Submenu”
signal_connect “destroy” do
Gtk.main_quit
end
init_ui
set_default_size 250, 200
set_window_position Gtk::Window::POS_CENTER
show_all
end
def init_ui
modify_bg Gtk::STATE_NORMAL, Gdk::Color.new(6400, 6400, 6440)
mb = Gtk::MenuBar.new
filemenu = Gtk::Menu.new
filem = Gtk::MenuItem.new “File”
filem.set_submenu filemenu
mb.append filem
imenu = Gtk::Menu.new
importm = Gtk::MenuItem.new “Import”
importm.set_submenu imenu
inews = Gtk::MenuItem.new “Import news feed…”
ibookmarks = Gtk::MenuItem.new “Import bookmarks…”
imail = Gtk::MenuItem.new “Import mail…”
imenu.append inews
imenu.append ibookmarks
imenu.append imail
filemenu.append importm
exit = Gtk::MenuItem.new “Exit”
exit.signal_connect “activate” do
Gtk.main_quit
end
filemenu.append exit
vbox = Gtk::VBox.new false, 2
vbox.pack_start mb, false, false, 0
add vbox
end
end
Gtk.init
window = RubyApp.new
Gtk.main
创建子菜单。
imenu = Gtk::Menu.new
子菜单也是Menu控件。
importm = Gtk::MenuItem.new “Import”
importm.set_submenu imenu
这是属于文件顶级菜单的菜单项的子菜单。
inews = Gtk::MenuItem.new “Import news feed…”
ibookmarks = Gtk::MenuItem.new “Import bookmarks…”
imail = Gtk::MenuItem.new “Import mail…”
imenu.append inews
imenu.append ibookmarks
imenu.append imail
子菜单有自己的菜单项。
图片:子菜单
图片菜单
接下来的例子我们将进一步探索菜单。我们将在菜单项上添加图片和快捷键(accelerators)。
#!/usr/bin/ruby
# ZetCode Ruby GTK tutorial
#
# This example shows a menu with
# images, accelerators and a separator
#
# author: jan bodnar
# website: www.zetcode.com
# last modified: June 2009
require ‘gtk2’
class RubyApp < Gtk::Window
def initialize
super
set_title “Image menu”
signal_connect “destroy” do
Gtk.main_quit
end
init_ui
set_default_size 250, 200
set_window_position Gtk::Window::POS_CENTER
show_all
end
def init_ui
modify_bg Gtk::STATE_NORMAL, Gdk::Color.new(6400, 6400, 6440)
mb = Gtk::MenuBar.new
filemenu = Gtk::Menu.new
filem = Gtk::MenuItem.new “File”
filem.set_submenu filemenu
agr = Gtk::AccelGroup.new
add_accel_group agr
newi = Gtk::ImageMenuItem.new Gtk::Stock::NEW, agr
key, mod = Gtk::Accelerator.parse “N”
newi.add_accelerator(“activate”, agr, key,
mod, Gtk::ACCEL_VISIBLE)
filemenu.append newi
openm = Gtk::ImageMenuItem.new Gtk::Stock::OPEN, agr
key, mod = Gtk::Accelerator.parse “O”
openm.add_accelerator(“activate”, agr, key,
mod, Gtk::ACCEL_VISIBLE)
filemenu.append openm
sep = Gtk::SeparatorMenuItem.new
filemenu.append sep
exit = Gtk::ImageMenuItem.new Gtk::Stock::QUIT, agr
key, mod = Gtk::Accelerator.parse “Q”
exit.add_accelerator(“activate”, agr, key,
mod, Gtk::ACCEL_VISIBLE)
exit.signal_connect “activate” do
Gtk.main_quit
end
filemenu.append exit
mb.append filem
vbox = Gtk::VBox.new false, 2
vbox.pack_start mb, false, false, 0
add vbox
end
end
Gtk.init
window = RubyApp.new
Gtk.main
这个例子显示了一个有子菜单的顶级菜单,每个菜单项都有一个图像和一个快捷键。退出菜单的快捷键是激活的。
agr = Gtk::AccelGroup.new
add_accel_group agr
为了使用快捷键,我们创建了一个全局的AccelGroup对象。它稍后被用到。
newi = Gtk::ImageMenuItem.new Gtk::Stock::NEW, agr
key, mod = Gtk::Accelerator.parse “N”
newi.add_accelerator(“activate”, agr, key,
mod, Gtk::ACCEL_VISIBLE)
filemenu.append newi
创建图片菜单项。图片来自图片库中。我们也创建了Ctrl+N快捷键。
sep = Gtk::SeparatorMenuItem.new
filemenu.append sep
这行创建一条分隔线。它用于将菜单项按照逻辑分组。
图片:图片菜单
菜单将我们使用的命令进行分组。工具条提供了一个快速访问最常用命令的方式。
简单的工具条
接下来我们创建一个简单的工具条。
#!/usr/bin/ruby
# ZetCode Ruby GTK tutorial
#
# This example shows a toolbar
# widget
#
# author: jan bodnar
# website: www.zetcode.com
# last modified: June 2009
require ‘gtk2’
class RubyApp < Gtk::Window
def initialize
super
set_title “Toolbar”
signal_connect “destroy” do
Gtk.main_quit
end
init_ui
set_default_size 250, 200
set_window_position Gtk::Window::POS_CENTER
show_all
end
def init_ui
toolbar = Gtk::Toolbar.new
toolbar.set_toolbar_style Gtk::Toolbar::Style::ICONS
newtb = Gtk::ToolButton.new Gtk::Stock::NEW
opentb = Gtk::ToolButton.new Gtk::Stock::OPEN
savetb = Gtk::ToolButton.new Gtk::Stock::SAVE
sep = Gtk::SeparatorToolItem.new
quittb = Gtk::ToolButton.new Gtk::Stock::QUIT
toolbar.insert 0, newtb
toolbar.insert 1, opentb
toolbar.insert 2, savetb
toolbar.insert 3, sep
toolbar.insert 4, quittb
quittb.signal_connect “clicked” do
Gtk.main_quit
end
vbox = Gtk::VBox.new false, 2
vbox.pack_start toolbar, false, false, 0
add(vbox)
end
end
Gtk.init
window = RubyApp.new
Gtk.main
这个例子显示了有四个工具按钮的工具栏。
toolbar = Gtk::Toolbar.new
创建Toolbar控件。
toolbar.set_toolbar_style Gtk::Toolbar::Style::ICONS
工具栏上我们只显示图标,没有文字。
newtb = Gtk::ToolButton.new Gtk::Stock::NEW
创建了一个包含图片的ToolButton控件。图片来自内建的图片库。
sep = Gtk::SeparatorToolItem.new
这是一个分隔符,用于将按钮按照逻辑分组。
toolbar.insert 0, newtb
toolbar.insert 1, opentb
…
将按钮添加到工具栏。
图片:工具栏
撤消重做
接下来的例子展示了如何停用工具栏上的按钮。这是GUI编程中的常见练习。例如对于保存按钮,在大多数编辑器中如果我们将文档的修改保存到磁盘中了,那么保存按钮会被停用。这是应用程序给用户的提示,所有修改都已保存。
#!/usr/bin/ruby
# ZetCode Ruby GTK tutorial
#
# This example shows how to
# activate/deactivate a ToolButton
#
# author: jan bodnar
# website: www.zetcode.com
# last modified: June 2009
require ‘gtk2’
class RubyApp < Gtk::Window
def initialize
super
set_title “Undo redo”
signal_connect “destroy” do
Gtk.main_quit
end
@count = 2
init_ui
set_default_size 250, 200
set_window_position Gtk::Window::POS_CENTER
show_all
end
def init_ui
toolbar = Gtk::Toolbar.new
toolbar.set_toolbar_style Gtk::Toolbar::Style::ICONS
@undo = Gtk::ToolButton.new Gtk::Stock::UNDO
@redo = Gtk::ToolButton.new Gtk::Stock::REDO
sep = Gtk::SeparatorToolItem.new
quit = Gtk::ToolButton.new Gtk::Stock::QUIT
toolbar.insert 0, @undo
toolbar.insert 1, @redo
toolbar.insert 2, sep
toolbar.insert 3, quit
@undo.signal_connect “clicked” do
on_undo
end
@redo.signal_connect “clicked” do
on_redo
end
quit.signal_connect “clicked” do
Gtk.main_quit
end
vbox = Gtk::VBox.new false, 2
vbox.pack_start toolbar, false, false, 0
self.add vbox
end
def on_undo
@count = @count - 1
if @count <= 0
@undo.set_sensitive false
@redo.set_sensitive true
end
end
def on_redo
@count = @count + 1
if @count >= 5
@redo.set_sensitive false
@undo.set_sensitive true
end
end
end
Gtk.init
window = RubyApp.new
Gtk.main
我们例子从GTK资源中创建了撤消和重做按钮。每个按钮点击多次后会被禁用,变为灰色。
@count = 2
@count变量用于描述按钮是禁用还是激活。
@undo = Gtk::ToolButton.new Gtk::Stock::UNDO
@redo = Gtk::ToolButton.new Gtk::Stock::REDO
创建两个工具按钮,图片来自资源库。
@undo.signal_connect “clicked” do
on_undo
end
点击undo按钮触发on_undo方法。
if @count <= 0
@undo.set_sensitive false
@redo.set_sensitive true
end
我们使用set_sensitive方法激活或者禁用控件。
图片:撤消重做
这章的Ruby GTK教程我们展示了如何使用菜单和工具栏。
原文地址: http://zetcode.com/gui/rubygtk/menustoolbars/
翻译:龙昌 admin@longchangjin.cn