Всем привет. С python и ООП я не давно. Принял решение писаль диплом на связке python pygtk gtk glade. Для практики и тренировки решил реализовать какую штуку:
Вот такой код реализует горизонтальное меню под заголовком экрана с элементами File и Edit. gtk.MenuBar как и gtk.MenuItem - это подклассы абстрактного базового класса gtk.MenuShell()
	self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.mainMenu = gtk.MenuBar()
        
        menuItem1 = gtk.MenuItem("_File")
        menuItem2 = gtk.MenuItem("_Edit")
        
        self.VBox1 = gtk.VBox(False, 0)
        self.window.set_default_size(800,600)
	     
        self.window.add(self.VBox1)
        self.VBox1.pack_start(self.mainMenu, False, False, 0)

        list = [menuItem1, menuItem2]
	for i in list:
	        self.mainMenu.append(menuItem1)

        self.VBox1.show()
        self.mainMenu.show()
        menuItem1.show()
        menuItem2.show()
        self.window.show()

При организации такого меню необходимо добавлять элементы методом append, и отображать их.
Я хочу написать класс (наверное он должен быть наследником) подобный gtk.MenuBar, только который уже в своем определении имеет какие либо элементы меню, а также при вызове метода show() появлялись бы и меню и его элементы.
Сделал так :), но чую IMHO полная фигня как я сделал:((((

#!/usr/bin/env python

try:
    import pygtk
    pygtk.require("2.0")
except:
    print "Error import pygtk"
    sys.exit(1)
try:
    import gtk
except:
    print "Error import gtk"
    sys.exit(1)

class myShell (gtk.MenuShell):
    def myItem (self, list):
        map (lambda i : self.append(i), list)
        map (lambda i : i.show(), list)
        
    def __init__(self):
        gtk.MenuShell.__init__(self)

        myItem1 = gtk.MenuItem("_File")
        myItem2 = gtk.MenuItem("_Options")
        myItem3 = gtk.MenuItem("_Run")
        myItem4 = gtk.MenuItem("_Help")
        list = [myItem1, myItem2, myItem3, myItem4]
        self.myItem(list)
        
class myBar (myShell,gtk.MenuBar):
    def __init__(self):
        myShell.__init__(self)
        gtk.MenuBar.__init__(self)
     

#print issubclass(myBar, gtk.MenuBar)
if __name__ == "__main__":
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        mainMenu = myBar()
        VBox1 = gtk.VBox(False, 0)
        #print mainMenu.get_children()
        window.add(VBox1)
        VBox1.pack_start(mainMenu, False, False, 0)
        window.set_default_size(800,600)
        window.connect("destroy", gtk.main_quit)
        VBox1.show()
        mainMenu.show()
        window.show()
        gtk.main()


Буду рад всем коментам.

Last edited Jan. 14, 2009, 11:21 p.m.