Skipping a gtk.Assistant Page Using set_forward_page_func()
A.K.A. Skipping Page 3!
I regularly use the excellent rednotebook for my daily notes at work. I recently decided I wanted to add a feature to the export dialogue which would allow the user to export only a selection of text. A code reviewer suggested that, if the user has selected this new export option on one page, the next page is not relevant and should be skipped. Easier said than done.
The export dialogue makes use of gtk.Assistant. Having looked at the
documentation,
I found def set_forward_page_func(page_func, data) and got my hopes up.
Unfortunately, I was unable to find any examples of this code in action. After
much trial and error, I found that the page_func needs to accept page (the
index of the current page) and needs to return the index of the next page to go
to.
I found an example of gtk.Assistant from
pygtk-tutorial
on gitorious.org and have edited it here to include the ability to skip page 3.
I hope this helps someone!
#!python #!/usr/bin/env python
import gtk
class Assistant: def init(self): assistant = gtk.Assistant()
assistant.connect(“apply”, self.button_pressed, “Apply”) assistant.connect(“cancel”, self.button_pressed, “Cancel”)
vbox = gtk.VBox() vbox.set_border_width(5) page = assistant.append_page(vbox) assistant.set_page_title(vbox, “Page 1: Starting Out”) assistant.set_page_type(vbox, gtk.ASSISTANT_PAGE_INTRO) label = gtk.Label(“”“This is an example label within an Assistant. The Assistant is used to guide a user through configuration of an application.”“”) label.set_line_wrap(True) vbox.pack_start(label, True, True, 0) assistant.set_page_complete(vbox, True)
vbox = gtk.VBox() vbox.set_border_width(5) assistant.append_page(vbox) assistant.set_page_title(vbox, “Page 2: Moving On…”) assistant.set_page_type(vbox, gtk.ASSISTANT_PAGE_CONTENT) label = gtk.Label(“”“This is an example of a label and checkbox within a page. If this box is checked, the assistant will skip page 3.”“”) label.set_line_wrap(True) self.checkbutton = gtk.CheckButton(“Skip next page”) vbox.pack_start(label, True, True, 0) vbox.pack_start(self.checkbutton, False, False, 0) assistant.set_page_complete(vbox, True)
vbox = gtk.VBox() vbox.set_border_width(5) assistant.append_page(vbox) assistant.set_page_title(vbox, “Page 3: The skipped page”) assistant.set_page_type(vbox, gtk.ASSISTANT_PAGE_CONTENT) label = gtk.Label(“”“This is an example of a page that contains information that may be skipped depending on the status of the previous pages.”“”) label.set_line_wrap(True) button = gtk.Button(“Button Example”) vbox.pack_start(label, True, True, 0) vbox.pack_start(button, False, False, 0) assistant.set_page_complete(vbox, True)
vbox = gtk.VBox() vbox.set_border_width(5) assistant.append_page(vbox) assistant.set_page_title(vbox, “Page 4: The Finale”) assistant.set_page_type(vbox, gtk.ASSISTANT_PAGE_CONFIRM) label = gtk.Label(“”“This is the final page of the Assistant widget. It could be used to confirm the preferences we have set in the previous pages.”“”) label.set_line_wrap(True) vbox.pack_start(label, True, True, 0) assistant.set_page_complete(vbox, True)
assistant.show_all() # Set an alternative function to return the next page to go to assistant.set_forward_page_func(self.pageforward)
def pageforward(self,page): “”" Function called when the forward button is pressed, Arguments: page: integer index of the current page returns: integer index of the next page to display “”" if page == 1 and self.checkbutton.get_active(): return 3 else: return page+1
def button_pressed(self, assistant, button): print “%s button pressed” % button gtk.main_quit()
Assistant() gtk.main()