[pygtk] TreeView selection issue
Alan F
matopoftheworld at live.co.uk
Tue Jan 27 07:18:15 WST 2009
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() or 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
_________________________________________________________________
Twice the fun—Share photos while you chat with Windows Live Messenger. Learn more.
http://www.microsoft.com/uk/windows/windowslive/products/messenger.aspx
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.daa.com.au/pipermail/pygtk/attachments/20090126/1163d145/attachment-0001.htm
More information about the pygtk
mailing list