Alan F wrote:
> Hi
>
> I am new to GTK programming. I want to create a program that displays 
> the sub-folders of a main folder in a tree view format. Once I find 
> the particular sub-folder , I want to be able to click on it to 
> display the contents of that folder. When the contents of that folder 
> is displayed, I want to click on any file to display the mp3 tags of 
> that file.
>
> I have managed to get a program working that displays all the 
> sub-folders of the main folder as a treeview. The problem is I am 
> having trouble trying to get it to do the next step i.e. when I click 
> on a sub-folder I want to display the contents of that folder.
>
> After googling around, I found a post that used a solution of adding a 
> button event to the treeview. I put it in an example code below and it 
> works but with a problem. 
>
> Firstly, to describe the actions of the example code, I've created a 
> treeeview that has 3 parents and 3 childs, when I click on a selection 
> (either parent or child), the value of that selection is printed in 
> the console.
>
> The problem is that when I click on any selection, nothing happens. 
> When I click on it again, the value of that selection is displayed. 
> When I click on another selection, the value of the previous selection 
> is displayed. When I click on that selection again, the values are 
> displayed. On clicking on any selection, the value of the previous one 
> is displayed.
>
> I've put console print statements throughout the code and the contents 
> are definately being displayed when I single click on selection. I can 
> only think it is something to do with the lines  treeselection = 
> self.treeview.get_selection(), (model, iter) = 
> treeselection.get_selected().
>
> I've checked the API and in TreeSelection there is text that may have 
> something to do my issue:
>
> "One of the important things to remember when monitoring the selection 
> of a view is that the "changed" signal is mostly a hint. That is, it 
> may only emit one signal when a range of rows is selected. 
> Additionally, it may on occasion emit a "changed" signal when nothing 
> has happened (mostly as a result of programmers calling the 
> |select_path|() 
> <file:///home/theman/documents/python/pygtkdoc/www.pygtk.org/docs/pygtk/class-gtktreeselection.html#method-gtktreeselection--select-path>
>  
> or |select_iter|() 
> <file:///home/theman/documents/python/pygtkdoc/www.pygtk.org/docs/pygtk/class-gtktreeselection.html#method-gtktreeselection--select-iter>
>  
> methods on an already selected row)."
>
> I don't really know enough about GTK programming to understand where 
> to start to look to fix this. Can someone please point me in the right 
> direction?
>
>
> # #######Start of file
> #!/usr/bin/env python
>
>
> import pygtk
> pygtk.require('2.0')
> import gtk
> import os
>
> class BasicTreeViewExample:
>
>     # close the window and quit
>     def delete_event(self, widget, event, data=None):
>         gtk.main_quit()
>         return False
>
>     def add_data(self):
>
>         # we'll add some data now - 4 rows with 3 child rows each
>             for parent in range(4):
>                     piter = self.treestore.append(None, ['parent %i' % 
> parent,  'value %i' %parent])
>             #print "this is path of parent " + str(parent)
>             #print self.treestore.get_path(piter)
>
>                     for child in range(3):
>                         citr = self.treestore.append(piter, ['parent  
> %i child %i' % (parent, child, ),  'value %i' %parent])
>             #print "this is path of parent " + str(parent) + "child " 
> + str(child)
>             #print self.treestore.get_path(citr)
>
>
>     def selectTest(self, widget, event):
>         print "This is event button"
>         print event.button
>         # Mouse press confirmed ok
>                 if event.button == 1:
>  
>                         #get data from highlighted selection      
>                         treeselection = self.treeview.get_selection()
>
>                         (model, iter) = treeselection.get_selected()
>             if iter != None :
>                 print "this is path of selected "
>
>                 print self.treestore.get_path(iter)
>                             print "value or select store"
>                 print self.treestore.get_value(iter, 0)
>                 print model.get_value(iter, 0)
>
>             else:
>                 print "no selection made"
>
>     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(300, 200)
>
>         self.window.connect("delete_event", self.delete_event)
>       
>         # create a new scrolled window.
>             scrolled_window = gtk.ScrolledWindow()
>             scrolled_window.set_border_width(10)
>
>             # the policy is one of POLICY AUTOMATIC, or POLICY_ALWAYS.
>             # POLICY_AUTOMATIC will automatically decide whether you need
>             # scrollbars, whereas POLICY_ALWAYS will always leave the 
> scrollbars
>             # there. The first one is the horizontal scrollbar, the 
> second, the
>             # vertical.
>             scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, 
> gtk.POLICY_ALWAYS)
>
>             # The dialog window is created with a vbox packed into it.
>             #self.window.vbox.pack_start(scrolled_window, True, True, 0)
>             scrolled_window.show()
>
>         # create a TreeStore with one string column to use as the model
>         self.treestore = gtk.TreeStore(str, str)
>         self.add_data()
>
>         # create the TreeView using liststore
>         self.treeview = gtk.TreeView(self.treestore)
>         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)
>        
>         self.treeview.add_events(gtk.gdk.BUTTON_PRESS_MASK)
>         self.treeview.connect('button_press_event', self.selectTest)
>
>             # Allow sorting on the column
>             #self.tvcolumn.set_sort_column_id(0)
>
>             # Allow drag and drop reordering of rows
>             self.treeview.set_reorderable(True)
>
>         # pack the table into the scrolled window
>         scrolled_window.add_with_viewport(self.treeview)
>         self.window.add(scrolled_window)
>              self.window.show_all()
>
> def main():
>     gtk.main()
>
> if __name__ == "__main__":
>     tvexample = BasicTreeViewExample()
>     main()
>
> # #######End of file
Is there some reason why you are not using the TreeSelection "changed" 
signal to track the selction changes and update your display? In your 
case I assume that only one selection at a time is allowed so the 
"changed" signal would seem to be ideal.

John
_______________________________________________
pygtk mailing list   pygtk@daa.com.au
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/

Reply via email to