当前位置: 首页 > 文档资料 > PyGTK 教程 >

03 PyGTK 中的菜单

优质
小牛编辑
115浏览
2023-12-01

在本教程的这个部分,我们将在菜单下工作

Menubar(菜单栏)是GUI程序最常见部分中的一个。它是位于各种菜单中的一组命令。当在控制台程序中,你必须记住所以那些晦涩难懂的命令,而在菜单里我们将大多数命令分组进入合乎逻辑的部分。因此,有一个公认的标准,那就是菜单能进一步减少大量的时间去学习一个新的程序。

Simple menu

在我们的第一个例子中,我们将创建一个只有一个文件菜单(file menu)的的菜单栏(menubar)。而这个菜单也仅仅只有一个菜单项目,通过选择这个菜单项,程序将会退出。

Code:simplemenu.py

#!/usr/bin/python

# ZetCode PyGTK tutorial 
#
# This example shows a simple menu
#
# author: jan bodnar
# website: zetcode.com 
# last edited: February 2009

import gtk

class PyApp(gtk.Window):

    def __init__(self):
        super(PyApp, self).__init__()

        self.set_title("Simple menu")
        self.set_size_request(250, 200)
        self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440))
        self.set_position(gtk.WIN_POS_CENTER)

        mb = gtk.MenuBar()

        filemenu = gtk.Menu()
        filem = gtk.MenuItem("File")
        filem.set_submenu(filemenu)
       
        exit = gtk.MenuItem("Exit")
        exit.connect("activate", gtk.main_quit)
        filemenu.append(exit)

        mb.append(filem)

        vbox = gtk.VBox(False, 2)
        vbox.pack_start(mb, False, False, 0)

        self.add(vbox)

        self.connect("destroy", gtk.main_quit)
        self.show_all()
        
        
PyApp()
gtk.main()

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

mb = gtk.MenuBar()

MenuBar部件被创建。

filemenu = gtk.Menu()
filem = gtk.MenuItem("File")
filem.set_submenu(filemenu)

顶层的MenuItem部件被创建。

exit = gtk.MenuItem("Exit")
exit.connect("activate", gtk.main_quit)
filemenu.append(exit)

退出MenuItem项被创建,并且被附加在文件MenuItem之下。

mb.append(filem)

顶层的MenuItem被追加到MenuBar部件之上

vbox = gtk.VBox(False, 2)
vbox.pack_start(mb, False, False, 0)

不想其它的工具包,我们得小心地布局我们的菜单栏。我们将菜单栏放进垂直箱子容器。

Figure:Simple Menu

Image Menu

在下一个例子中,我们将更深入的探究菜单。我们将增加图片和快捷键到我们的菜单项。Accelerators就是为了激活菜单项的键盘快捷键。

Code:imagemenu.py

#!/usr/bin/python

# ZetCode PyGTK tutorial 
#
# This example shows a menu with
# images, accelerators and a separator
#
# author: jan bodnar
# website: zetcode.com 
# last edited: February 2009

import gtk

class PyApp(gtk.Window):

    def __init__(self):
        super(PyApp, self).__init__()

        self.set_title("Image menu")
        self.set_size_request(250, 200)
        self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440))
        self.set_position(gtk.WIN_POS_CENTER)

        mb = gtk.MenuBar()

        filemenu = gtk.Menu()
        filem = gtk.MenuItem("_File")
        filem.set_submenu(filemenu)
       
        agr = gtk.AccelGroup()
        self.add_accel_group(agr)

        newi = gtk.ImageMenuItem(gtk.STOCK_NEW, agr)
        key, mod = gtk.accelerator_parse("<Control>N")
        newi.add_accelerator("activate", agr, key, 
            mod, gtk.ACCEL_VISIBLE)
        filemenu.append(newi)

        openm = gtk.ImageMenuItem(gtk.STOCK_OPEN, agr)
        key, mod = gtk.accelerator_parse("<Control>O")
        openm.add_accelerator("activate", agr, key, 
            mod, gtk.ACCEL_VISIBLE)
        filemenu.append(openm)

        sep = gtk.SeparatorMenuItem()
        filemenu.append(sep)

        exit = gtk.ImageMenuItem(gtk.STOCK_QUIT, agr)
        key, mod = gtk.accelerator_parse("<Control>Q")
        exit.add_accelerator("activate", agr, key, 
            mod, gtk.ACCEL_VISIBLE)

        exit.connect("activate", gtk.main_quit)
        
        filemenu.append(exit)

        mb.append(filem)

        vbox = gtk.VBox(False, 2)
        vbox.pack_start(mb, False, False, 0)

        self.add(vbox)

        self.connect("destroy", gtk.main_quit)
        self.show_all()
        

PyApp()
gtk.main()

我们的示例展示了一个顶层菜单项,其包含了3个次级菜单项。每一个菜单都包含一个图片和一个快捷键。退出菜单项的快捷键是激活的。

agr = gtk.AccelGroup()
self.add_accel_group(agr)

为了使用快捷键,我们创建了一个全局的AccelGroup对象,它将在之后被使用。

newi = gtk.ImageMenuItem(gtk.STOCK_NEW, agr)

ImageMenuItem被创建。图片来自于内置的图片库。

key, mod = gtk.accelerator_parse("<Control>N")

函数gtk.accelerator_parse(),是从语法上分析指定的快捷键字符,并且返回一个含2个元素的元组,两个元素分别为:keyval(字符键对应的键值,如:N=110,O=111等)和与快捷键相关的修饰控制键(如:Control, Alt等)的对象。【此处()中为译者测试结果】

newi.add_accelerator("activate", agr, key, 
    mod, gtk.ACCEL_VISIBLE)

以上代码,为退出菜单项创建了Ctrl+Q快捷键。

sep = gtk.SeparatorMenuItem()
filemenu.append(sep)

这些代码创建了一个分隔符,其用于将菜单项分成逻辑组。

Figure:Image Menu

CheckMenuItem

CheckMenuItem就是一个包含复选框的菜单项。它被用来工作于布尔属性(boolean properties)。

Code:checkmenuitem.py

#!/usr/bin/python

# ZetCode PyGTK tutorial 
#
# This example shows how to 
# use a CheckMenuItem
#
# author: jan bodnar
# website: zetcode.com 
# last edited: February 2009

import gtk

class PyApp(gtk.Window):

    def __init__(self):
        super(PyApp, self).__init__()

        self.set_title("Check menu item")
        self.set_size_request(250, 200)
        self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440))
        self.set_position(gtk.WIN_POS_CENTER)

        mb = gtk.MenuBar()

        filemenu = gtk.Menu()
        filem = gtk.MenuItem("File")
        filem.set_submenu(filemenu)
       
        viewmenu = gtk.Menu()
        view = gtk.MenuItem("View")
        view.set_submenu(viewmenu)

        stat = gtk.CheckMenuItem("View Statusbar")
        stat.set_active(True)
        stat.connect("activate", self.on_status_view)
        viewmenu.append(stat)
       
        exit = gtk.MenuItem("Exit")
        exit.connect("activate", gtk.main_quit)
        filemenu.append(exit)

        mb.append(filem)
        mb.append(view)

        self.statusbar = gtk.Statusbar()
        self.statusbar.push(1, "Ready")

        vbox = gtk.VBox(False, 2)
        vbox.pack_start(mb, False, False, 0)
        vbox.pack_start(gtk.Label(), True, False, 0)
        vbox.pack_start(self.statusbar, False, False, 0)

        self.add(vbox)

        self.connect("destroy", gtk.main_quit)
        self.show_all()
        
        
    def on_status_view(self, widget):
        if widget.active: 
            self.statusbar.show()
        else:
            self.statusbar.hide()
        

PyApp()
gtk.main()

在我们的代码示例中,我们展示了一个复选框菜单项。如果复选框被激活,则状态栏部件将被显示,否则被隐藏。

stat = gtk.CheckMenuItem("View Statusbar")

CheckMenuItem部件被创建。

stat.set_active(True)

set_active()方法是用于激活或者不激活复选框菜单项。

if widget.active: 
    self.statusbar.show()
else:
    self.statusbar.hide()

依据CheckMenuItem的激活属性,我们可以显示或者隐藏状态栏部件。

Figure:CheckMenuItem

SubMenu

在最后的例子中,我们证明了在PyGTK中怎样创建了一个次级菜单。

Code:submenu.py

#!/usr/bin/python

# ZetCode PyGTK tutorial 
#
# This example shows a submenu
#
# author: jan bodnar
# website: zetcode.com 
# last edited: February 2009

import gtk

class PyApp(gtk.Window):

    def __init__(self):
        super(PyApp, self).__init__()

        self.set_title("Submenu")
        self.set_size_request(250, 200)
        self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440))
        self.set_position(gtk.WIN_POS_CENTER)

        mb = gtk.MenuBar()

        filemenu = gtk.Menu()
        filem = gtk.MenuItem("File")
        filem.set_submenu(filemenu)
       
        mb.append(filem)
        
        imenu = gtk.Menu()

        importm = gtk.MenuItem("Import")
        importm.set_submenu(imenu)

        inews = gtk.MenuItem("Import news feed...")
        ibookmarks = gtk.MenuItem("Import bookmarks...")
        imail = gtk.MenuItem("Import mail...")

        imenu.append(inews)
        imenu.append(ibookmarks)
        imenu.append(imail)

        filemenu.append(importm)
        
        exit = gtk.MenuItem("Exit")
        exit.connect("activate", gtk.main_quit)
        filemenu.append(exit)

        vbox = gtk.VBox(False, 2)
        vbox.pack_start(mb, False, False, 0)

        self.add(vbox)

        self.connect("destroy", gtk.main_quit)
        self.show_all()
        
       
PyApp()
gtk.main()

创建次级菜单。

imenu = gtk.Menu()

一个次级菜单就是一个Menu

importm = gtk.MenuItem("Import")
importm.set_submenu(imenu)

这是一个菜单项的次级菜单,其属于顶级文件菜单。

inews = gtk.MenuItem("Import news feed...")
ibookmarks = gtk.MenuItem("Import bookmarks...")
imail = gtk.MenuItem("Import mail...")

imenu.append(inews)
imenu.append(ibookmarks)
imenu.append(imail)

次级菜单有其自己的菜单项。

Figure:Submenu

在PyGTK编程教程的这章中,我们展示了怎样用菜单工作。