Hi

I am attempting to incorporate multiple selections of a list-store into
a program I am working on. To get my head round it, I have written the
following test program (written in python-gtk2-2.17 on ubuntu 10.4):

=======================================================================
#!/usr/bin/env python


import pygtk
pygtk.require('2.0')
import gtk
import os
from datetime import datetime
import logging
# Turn logging on or off
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s
%(levelname)s: %(message)s',datefmt='%Y-%m-%d %H:%M:%S') # Turn logging
on 
#logging.basicConfig() # Turn debugging off


class BasicTreeViewExample:

        pathlist = []


        # close the window and quit
        def delete_event(self, widget, event, data=None):
                gtk.main_quit()
                return False

        def button_cb(self, widget,  data=None):
                print ("button pressed")
                logging.debug("contents of pathlist" + str(self.pathlist))
                logging.debug("length of pathlist=" + str(len(self.pathlist)))
                logging.debug(str("value of pathlist[0]=" + 
str(self.pathlist[0])))
                model = self.treeview.get_model()
                for x in self.pathlist:
                        iter = model.get_iter(x)
                        if iter != None :
                                print ("value or select store=" + 
model.get_value(iter, 1))


        def add_data(self):
                # we'll add some data now - 4 rows 
                piter = self.liststore.append(["acdc - highway to hell",  
"$MUSIC\acdc
\highway"])
                piter = self.liststore.append(["Saxon - inner sanctum",  
"$MUSIC\saxon
\inner"])
                piter = self.liststore.append(["Gun - Greatest Hist",  
"$MUSIC\gun
\greatest_hits"])
                piter = self.liststore.append(["ABC - Look of love",  
"$music\abc
\look_of_love"])

        def selecttest1(self, widget):
                #get data from highlighted selection
                treeselection = widget.get_selection()

                (model, self.pathlist) = treeselection.get_selected_rows()
                logging.debug("lenght of pathlist=" + str(len(self.pathlist)))

        def my_treeview(self):
                # create a ListStore with one string column to use as the model
                self.liststore = gtk.ListStore(str, str)
                self.add_data()
                self.treeview = gtk.TreeView(self.liststore)
                self.treeview.set_headers_visible(False)
                # create the TreeViewColumn to display the data
                self.tvcolumn = gtk.TreeViewColumn()
                # add tvcolumn to treeview
                self.treeview.append_column(self.tvcolumn)
                # create a CellRendererText to render the data
                self.cell = gtk.CellRendererText()
                # add the cell to the tvcolumn and allow it to expand
                self.tvcolumn.pack_start(self.cell, True)
                # set the cell "text" attribute to column 0 - retrieve text
    # from that column in treestore
                self.tvcolumn.add_attribute(self.cell, 'text', 0)
                # make it searchable
                self.treeview.set_search_column(0)
                # Allow drag and drop reordering of rows
                self.treeview.set_reorderable(False)
                return (self.treeview)

        def __init__(self):
                # Create a new window
                self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
                self.window.set_title("Music Collection")
                self.window.set_size_request(500, 200)
                self.window.connect("delete_event", self.delete_event)          
        
                table1 = gtk.Table(1, 2, False)
                table1.set_row_spacings( 5)
                table1.set_col_spacings(5)
                self.window.add(table1)  
                # create the TreeView using liststore
                self.treeview = self.my_treeview() 
                treeselection = self.treeview.get_selection()
                treeselection.set_mode(gtk.SELECTION_MULTIPLE)
                # values colx, coly, roxx, rowy
                table1.attach(self.treeview, 0, 1, 0, 1)
                my_button  = gtk.Button("click here")
                table1.attach(my_button, 1,2, 0, 1)
                self.treeview.connect('cursor-changed', self.selecttest1)
                my_button.connect('clicked', self.button_cb)
                self.window.show_all()
                table1.show()

def main():
        gtk.main()

if __name__ == "__main__":
    tvexample = BasicTreeViewExample()
    main()
=====================================================

The problem is that if more than one item is selected, say two, you have
to click on the second item twice for it to register when the button is
clicked.

I tried the treeselection.selected_foreach function as well:


==========================================================
#!/usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk
import os
from datetime import datetime
import logging
# Turn logging on or off
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s
%(levelname)s: %(message)s',datefmt='%Y-%m-%d %H:%M:%S') # Turn logging
on 
#logging.basicConfig() # Turn debugging off


class BasicTreeViewExample:

        pathlist = []

        # close the window and quit
        def delete_event(self, widget, event, data=None):
                gtk.main_quit()
                return False

        def button_cb(self, widget,  data=None):
                print ("button pressed")
                logging.debug("contents of pathlist" + str(self.pathlist))
                logging.debug("self =" + str(self) + " widget=" + str(widget))
                logging.debug("length of pathlist" + str(len(self.pathlist)))
                logging.debug(str("value of pathlist[0]=" + 
str(self.pathlist[0])))
                model = self.treeview.get_model()
                iter = model.get_iter(self.pathlist[0])
                if iter != None :
                        logging.debug( "value or select store=" + 
model.get_value(iter, 0))
                        logging.debug(iter)


        def add_data(self):
                # we'll add some data now - 4 rows 
                piter = self.liststore.append(["acdc - highway to hell",  
"$MUSIC\acdc
\highway"])
                piter = self.liststore.append(["Saxon - inner sanctum",  
"$MUSIC\saxon
\inner"])
                piter = self.liststore.append(["Gun - Greatest Hist",  
"$MUSIC\gun
\greatest_hits"])
                piter = self.liststore.append(["ABC - Look of love",  
"$music\abc
\look_of_love"])

        def foreach_cb(self,model, path, iter):
    #list.append(path)
                logging.debug("inside foreeach_cb")
                logging.debug("path=" + str(path))
                logging.debug("iter=" + str(iter))
                if iter != None :
                        logging.debug ("value or select store=" + 
model.get_value(iter, 1))

        def selecttest1(self, widget):
                #get data from highlighted selection
                treeselection = widget.get_selection()
                treeselection.set_mode(gtk.SELECTION_MULTIPLE)
                treeselection.selected_foreach(self.foreach_cb)

        def my_treeview(self):
                # create a ListStore with one string column to use as the model
                self.liststore = gtk.ListStore(str, str)
                self.add_data()
                self.treeview = gtk.TreeView(self.liststore)
                self.treeview.set_headers_visible(False)
                # create the TreeViewColumn to display the data
                self.tvcolumn = gtk.TreeViewColumn()
                # add tvcolumn to treeview
                self.treeview.append_column(self.tvcolumn)
                # create a CellRendererText to render the data
                self.cell = gtk.CellRendererText()
                # add the cell to the tvcolumn and allow it to expand
                self.tvcolumn.pack_start(self.cell, True)
                # set the cell "text" attribute to column 0 - retrieve text
        # from that column in treestore
                self.tvcolumn.add_attribute(self.cell, 'text', 0)
                # make it searchable
                self.treeview.set_search_column(0)
                # Allow drag and drop reordering of rows
                self.treeview.set_reorderable(False)
                return (self.treeview)

        def __init__(self):
                # Create a new window
                self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

                self.window.set_title("Music Collection")
                self.window.set_size_request(500, 200)
                self.window.connect("delete_event", self.delete_event)          
                table1 = gtk.Table(1, 2, False)
                table1.set_row_spacings( 5)
                table1.set_col_spacings(5)
                self.window.add(table1)   
                # create the TreeView using liststore
                self.treeview = self.my_treeview()      
                # values colx, coly, roxx, rowy
                table1.attach(self.treeview, 0, 1, 0, 1)
                my_button  = gtk.Button("click here")
                table1.attach(my_button, 1,2, 0, 1)
                self.treeview.connect('cursor-changed', self.selecttest1)
                my_button.connect('clicked', self.button_cb)
                self.window.show_all()
                table1.show()

def main():
        gtk.main()

if __name__ == "__main__":
    tvexample = BasicTreeViewExample()
    main()

=========================================

Although the button isn't fully functioning properly as I am only using
the debug messages to see it's behaviour. Unfortunately it is behaving
the same way as first example.

I don't know if I am missing something. Can someone please help.

Thanks in advance.

Alan.


_______________________________________________
pygtk mailing list   [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/

Reply via email to