0

I'm a first time user of pygtk. I've modified some existing code from the gtk docs to add tab dragging functionality, but the label isn't redrawn on drag and goes white instead. How do I redraw it?

#!/usr/bin/env python

# example notebook.py

import gtk

class NotebookExample:
    # This method rotates the position of the tabs
    def rotate_book(self, button, notebook):
        notebook.set_tab_pos((notebook.get_tab_pos()+1) %4)

    # Add/Remove the page tabs and the borders
    def tabsborder_book(self, button, notebook):
        tval = gtk.FALSE
        bval = gtk.FALSE
        if self.show_tabs == gtk.FALSE:
            tval = gtk.TRUE
        if self.show_border == gtk.FALSE:
            bval = gtk.TRUE

        notebook.set_show_tabs(tval)
        self.show_tabs = tval
        notebook.set_show_border(bval)
        self.show_border = bval

    # Remove a page from the notebook
    def remove_book(self, button, notebook):
        page = notebook.get_current_page()
        notebook.remove_page(page)
        # Need to refresh the widget --
        # This forces the widget to redraw itself.
        notebook.draw((0,0,-1,-1))

    def delete(self, widget, event=None):
        gtk.mainquit()
        return gtk.FALSE

    def __init__(self):
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.connect("delete_event", self.delete)
        window.set_border_width(10)

        table = gtk.Table(3,6,gtk.FALSE)
        window.add(table)

        # Create a new notebook, place the position of the tabs
        notebook = gtk.Notebook()
        notebook.set_tab_pos(gtk.POS_TOP)
        table.attach(notebook, 0,6,0,1)
        notebook.show()
        self.show_tabs = gtk.TRUE
        self.show_border = gtk.TRUE

        # Let's append a bunch of pages to the notebook
        for i in range(5):
            bufferf = "Append Frame %d" % (i+1)
            bufferl = "Page %d" % (i+1)

            frame = gtk.Frame(bufferf)
            frame.set_border_width(10)
            frame.set_usize(100, 75)
            frame.show()

            label = gtk.Label(bufferf)
            frame.add(label)
            label.show()

            label = gtk.Label(bufferl)
            notebook.append_page(frame, label)
            notebook.set_tab_reorderable(frame, True)

        # Now let's add a page to a specific spot
        checkbutton = gtk.CheckButton("Check me please!")
        checkbutton.set_usize(100, 75)
        checkbutton.show ()

        label = gtk.Label("Add page")
        notebook.insert_page(checkbutton, label, 2)

        # Now finally let's prepend pages to the notebook
        for i in range(5):
            bufferf = "Prepend Frame %d" % (i+1)
            bufferl = "PPage %d" % (i+1)

            frame = gtk.Frame(bufferf)
            frame.set_border_width(10)
            frame.set_usize(100, 75)
            frame.show()

            label = gtk.Label(bufferf)
            frame.add(label)
            label.show()

            label = gtk.Label(bufferl)
            notebook.prepend_page(frame, label)

        # Set what page to start at (page 4)
        notebook.set_page(3)

        # Create a bunch of buttons
        button = gtk.Button("close")
        button.connect("clicked", self.delete)
        table.attach(button, 0,1,1,2)
        button.show()

        button = gtk.Button("next page")
        button.connect("clicked", notebook.next_page)
        table.attach(button, 1,2,1,2)
        button.show()

        button = gtk.Button("prev page")
        button.connect("clicked", notebook.prev_page)
        table.attach(button, 2,3,1,2)
        button.show()

        button = gtk.Button("tab position")
        button.connect("clicked", self.rotate_book, notebook)
        table.attach(button, 3,4,1,2)
        button.show()

        button = gtk.Button("tabs/border on/off")
        button.connect("clicked", self.tabsborder_book, notebook)
        table.attach(button, 4,5,1,2)
        button.show()

        button = gtk.Button("remove page")
        button.connect("clicked", self.remove_book, notebook)
        table.attach(button, 5,6,1,2)
        button.show()

        table.show()
        window.show()

def main():
    gtk.mainloop()
    return 0

if __name__ == "__main__":
    NotebookExample()
    main()
liberforce
  • 11,189
  • 37
  • 48
simonzack
  • 19,729
  • 13
  • 73
  • 118

1 Answers1

1

The sample is a bit buggy (the next and prev buttons don't work for me because there are to many arguments given to the callback), but otherwise, moving any "Page x" (not "PPage x") page works as expected. I'm using GTK 2.24.17 under GNU/Linux (Mageia 3).

liberforce
  • 11,189
  • 37
  • 48
  • I'm on GTK 2.24.22 on arch, but I've since switched to gtk 3 with pygobject and the problem seems to have disappeared. Probably a gtk bug then. Thanks for testing the code. – simonzack Jan 15 '14 at 06:25