Home  Contents

Menus in PyGTK

فى هذه الجزئية سنتحدث على القوائم

شريط القوائم احد اوضح الأجزاء فى واجهة التطبيق، هو مجموعة من الأوامر المرتبطة موجودة فى قوائم. فى تطبيق الكونسول كنت تحتاج لتذكر كل هذه الأوامر، ولكن هنا نجدها مجمعة فى اماكن منطقية



Simple menu

فى المثال الأول، سننشئ شريط قوائم وبقائمة file والتى تحوى بدورها على عنصر واحد عند اختياره يتم غلق التطبيق

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()

انشاء الشريط

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

انشاء العنصر العلوى filem اللذى سيحوى قائمة filemenu

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

انشاء العنصر exit واضافته للfilemenu

 mb.append(filem)

اضافة العنصر العلوى لشريط القوائم

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

بعكس الtoolkits الأخرى، يجب علينا الإهتمام بإدارة المخططات بنفسنا، فنضع شريط القوائم فى صندوق رأسى

Simple menu

Figure: Simple menu



Image menu

فى المثال التالى، سنستكشف القوائم اكثر.. سنضيف صورا ومسرعات -اختصارات- لعناصر القائمة

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("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("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("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 عناصر فرعية كل منها له صورة ومسرع، المسرع لعنصر quit مفعل

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

للعمل مع المسرعات.. ننشئ كائن عام من الصف AccelGroup.. سنستخدمه لاحقا

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

انشاء العنصر، والصورة تأتى من ال Stock وهى صورة ملف جديد

 key, mod = gtk.accelerator_parse("N")

الطريقة gtk.accelerator_parse تعالج المسرع المحدد وتعيد قيمة المفتاح والقناع

The gtk.accelerator_parse() function parses the specified accelerator string and returns a 2-tuple containing the keyval and modifier mask corresponding to accelerator.

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

هذا ينشئ مسرع -اختصار- من الزرين كنترول و Q للعنصر exit

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

السابق ينشئ عنصر فاصل، ليتم تقسيم العناصر لمجموعات منطقية


Image menu

Figure: Image menu



CheckMenuItem

يستخدم فى اضافة عنصر قابل للتنشيط، يستخدم للقيم المنطقية كال CheckButton

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")

انشاء الكائن

 stat.set_active(True)

الطريقة set_active تحدد حالة التنشيط للعنصر

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

بناءا على حالة العنصر يتم تحديد حالة شريط الحالة


CheckMenuItem

Figure: CheckMenuItem



Submenu

فى مثالنا الأخير سنتعرض لكيفية انشاء قائمة فرعية

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)

وتكون هى القائمة الفرعية لعنصر ما، فنستطيع تحديد ذلك من الخاصية Submenu

 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)

للقائمة الفرعية مجموعة من العناصر داخلها


Submenu

Figure: Submenu



فى هذه الجزئية تعرضنا لإنشاء القوائم والتعامل معها فى PyGTK



Home ‡ Contents ‡ Top of Page