[pygtk] gtk.Notebook
Sylvain Saleur
syeric1 at gmail.com
Tue Jan 8 05:57:22 WST 2008
Hello.
I just copy a small program I've done which generate a notebook with a
close button. Hopefully it will be helpful for you.
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# notebook.py
import pygtk
pygtk.require('2.0')
import gtk
class NotebookExample:
def add_icon_to_button(self,button):
"Function that add the icon to the button"
#Hbox creation
iconBox = gtk.HBox(False, 0)
#Empty image creation
image = gtk.Image()
#Let's get the default gtk close button
image.set_from_stock(gtk.STOCK_CLOSE,gtk.ICON_SIZE_MENU)
#set the relief off
gtk.Button.set_relief(button,gtk.RELIEF_NONE)
#Get the settings of the button
settings = gtk.Widget.get_settings(button)
#w and h dimensions of the button
(w,h) = gtk.icon_size_lookup_for_settings(settings,gtk.ICON_SIZE_MENU)
#modification of the dimensions
gtk.Widget.set_size_request(button, w + 4, h + 4)
image.show()
#pack the image in the box
iconBox.pack_start(image, True, False, 0)
#add the box in the button
button.add(iconBox)
iconBox.show()
return
def create_custom_tab(self,text, notebook, frame):
"Create a custom tab with a label and the button"
#eventbox creation
eventBox = gtk.EventBox()
#Hbox creation
tabBox = gtk.HBox(False, 2)
#"text" label creation
tabLabel = gtk.Label(text)
#creation of a button
tabButton=gtk.Button()
#connect to the "remove_book" function
tabButton.connect('clicked',self.remove_book, notebook, frame)
#add the icon with the previously defined add_icon_to_button
self.add_icon_to_button(tabButton)
eventBox.show()
tabButton.show()
tabLabel.show()
#add label and button
tabBox.pack_start(tabLabel, False)
tabBox.pack_start(tabButton, False)
tabBox.show_all()
#add the box to the eventox
eventBox.add(tabBox)
return eventBox
def remove_book(self, button, notebook, frame):
"Function to remove the page"
#suppress the page. You must give the child widget of the page
notebook.remove(frame)
# you call the previous page
notebook.queue_draw_area(0,0,-1,-1)
def delete(self, widget, event=None):
gtk.main_quit()
return False
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.connect("delete_event", self.delete)
window.set_border_width(10)
#book generation
notebook = gtk.Notebook()
window.add(notebook)
notebook.show()
# some pages
for i in range(5):
page_number = i + 1
frame = gtk.Frame("Frame %d" % page_number)
frame.set_border_width(10)
frame.set_size_request(100, 75)
frame.show()
label = gtk.Label("In the Frame %d" % page_number)
frame.add(label)
label.show()
eventBox = self.create_custom_tab("Tab %d" % page_number,
notebook, frame)
notebook.append_page(frame, eventBox)
# page you see at the opening
notebook.set_current_page(3)
window.show()
def main():
gtk.main()
return 0
if __name__ == "__main__":
NotebookExample()
main()
I'm sure we can do that more quickly but it works and as you can see
in the code style, I'm not a specialist...
Hope it will help you.
Sylvain
2008/1/7, johnthawk at excite.com <johnthawk at excite.com>:
>
> In gtk notebook page_num(child) being a widget
> Returns : the index of the page containing child, or -1
>
> So here is the problem:
>
> Added button to tab for close so I need the page the button is on since the
> button grabs focus rather than the tab. I tried emit back to parent and that
> failed to produce anything.
>
> The code segements:
>
> Creation:
> #--------------------------------------------------------------------------
> def new_page(self, arg, filename):
> self.z = self.z + 1
> # create scroller, gtksourceview, buffer and set mime
> scroller = gtk.ScrolledWindow()
> scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
> bufferS = gtksourceview.SourceBuffer()
> manager = gtksourceview.SourceLanguagesManager()
> if arg:
> type = gnomevfs.get_mime_type(arg)
> language = manager.get_language_from_mime_type(type)
> else:
> language = manager.get_language_from_mime_type('text')
> bufferS.set_language(language)
> view = gtksourceview.SourceView(bufferS)
> scroller.add(view)
> # set defaults for gtksourceview and buffer
> bufferS.set_highlight(self.HIGHLIGHT)
> bufferS.set_check_brackets(self.CHECK_BRACKETS)
> view.set_show_line_numbers(self.SHOW_LINE_NUMBERS)
> view.set_show_margin(self.SHOW_MARGIN)
> view.set_auto_indent(self.AUTO_INDENT)
> view.set_tabs_width(int(self.TABS_WIDTH))
> view.set_insert_spaces_instead_of_tabs(self.INSERT_SPACES_INSTEAD_OF_TABS)
> view.set_margin(int(self.MARGIN))
> # add close button
> image = gtk.Image()
> image.set_from_file("data/images/close.png")
> btn = gtk.Button()
> btn.add(image)
> btn.connect('clicked',self.on_close_btn)
> #btn.set_size_request(16,16)
> # add label
> hbox = gtk.HBox(False,3)
> if not arg:
> self.key[self.z] = gtk.Label(filename)
> else:
> self.key[self.z] = gtk.Label(filename.rsplit('/',1)[1])
> hbox.add(self.key[self.z])
> hbox.add(btn)
> hbox.show_all()
> # load and set text
> if arg:
> try:
> bufferS.begin_not_undoable_action()
> f = open(arg, 'r')
> bufferS.set_text(f.read())
> f.close()
> bufferS.end_not_undoable_action()
> except:
> print 'File Error: '+arg
> else:
> bufferS.set_text('')
> # populate tree
> iter = None
> iter = self.mod.append(iter)
> if arg:
> self.mod.set(iter,0, arg)
> else:
> self.mod.set(iter,0, filename)
> self.mod.set(iter,1, self.key[self.z].get_text())
> self.mod.set(iter,2, view)
> self.mod.set(iter,3, bufferS)
> self.mod.set(iter,4, self.key[self.z])
> self.view = view
> self.bufferS = bufferS
> # add page
> page = self.mdi_book.append_page(scroller,hbox)
> self.mdi_book.show_all()
> # switch to page
> self.mdi_book.set_current_page(page)
>
> Callbacks:
> #--------------------------------------------------------------------------
> def on_close_btn(self, widget):
> page = self.mdi_book.page_num(widget)
> print page
> #--------------------------------------------------------------------------
> def on_close(self, widget):
> p = self.mdi_book.get_current_page()
> self.on_update_tree('delete')
> self.mdi_book.remove_page(p)
>
>
>
>
>
> _______________________________________________
> Join Excite! - http://www.excite.com
> The most personalized portal on the Web!
>
>
> _______________________________________________
> pygtk mailing list pygtk at daa.com.au
> http://www.daa.com.au/mailman/listinfo/pygtk
> Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/
>
More information about the pygtk
mailing list