hi all,

i rewriting code for my filebrowser to GIO.
Functionality is perfect for my program.
But i want monitoring some changes in actual dir.
( for update etc.)

i know its gioFile.monitor_directory() but i never user
gobject too much.
seems that event catching for gio.File dont work in gtk.main() loop.
after googling i know i must use gobject.MainLoop().run() instead.

after rewrite my gtk.main() loop into gobject.MainLoop() monitoring
still dont work :( 

Please kick me to the right way.

i have main program in gtk.main() loop.
this program have 'million :)' gui widgets.
from this program i importing FileBrowser module
and adding it into notebook.
Please help me get monitoring working.

PS : any comments for make this example better are welcome thanks.
BTW: sry for my horible english.

.. MAIN program snippet :)
......
......
import FileBrowser
self.__browser = FileBrowser.FileBrowser()
self.__plug.append_page(self.__browser, Label('FileBrowser'))
......
......
if __name__ == '__main__':
        APP = MyApp()
        gtk.main()
        '''
        from gobject import MainLoop
        MainLoop().run()
        '''
.. END of Main program




here is FileBrowser module:
-------------------------------------------------------------------------
#!/usr/bin/python
# -*- coding: utf-8 -*-
' DIRECTORY TREE WALKER PRO EDITOR '

import os.path
def package_home(gdict):
    """ Zajisti ze se potrebne soubory budou
        hledat relativne v adresari kde je spousteny
        program
    """
    
    filename = gdict["__file__"]
    return os.path.dirname(filename)

from gtk import VBox
class FileBrowser(VBox):
    def __init__(self):
        VBox.__init__(self)
        
        from gio import File as gioFile
        from gtk.gdk import pixbuf_new_from_file_at_size
        
        self.FOLDER_ICON = 
pixbuf_new_from_file_at_size(os.path.join(package_home(globals()), 
'pics/folder.png'), 16, 16)
        self.HOME_ICON   = 
pixbuf_new_from_file_at_size(os.path.join(package_home(globals()), 
'pics/hdd.png'), 16, 16)

        self.PIXBUF = 0
        self.GIO    = 1
        self.NAME   = 2
        self.PATH   = 3
        
        from gtk import ListStore, TreeView, CellRendererText, 
CellRendererPixbuf
        from gtk.gdk import Pixbuf as gdkPixbuf
        
        self.__liststore = ListStore(gdkPixbuf, gioFile, str, str)
        treeview         = TreeView(self.__liststore)
        treeview.set_headers_visible(False)
        treeview.set_rules_hint(True)
        treeview.connect('row-activated', self.__row_activated)
        
        cell = CellRendererText()
        pixx = CellRendererPixbuf()
        treeview.insert_column_with_attributes(-1, 'Pix', pixx, 
pixbuf=self.PIXBUF)
        treeview.insert_column_with_attributes(-1, 'Filename', cell, 
markup=self.NAME)
        
        from gtk import ScrolledWindow, POLICY_AUTOMATIC, SHADOW_ETCHED_IN
        scroll = ScrolledWindow()
        scroll.set_border_width(2)
        scroll.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC)
        scroll.set_shadow_type(SHADOW_ETCHED_IN)
        scroll.add(treeview)
        
        self.pack_start(scroll, True, True)
        
        f = gioFile('.')
        self.browse_directory(f)
        self.show_all()
   
    def __row_activated(self, view, path, column):
        ' kliknuto na polozku v seznamu '
        
        model = view.get_model()
        row   = model[path]
        if row[self.PATH] == '<dir>':
            self.browse_directory(row[self.GIO])
        else:
            print 'kliknuto na: %s.' % row[self.GIO].get_parse_name()
            
    def browse_directory(self, directory):
        ' vyplni strukturu File '
        
        subdirs = []
        files   = []
        
        try:
            infos   = (directory.enumerate_children('standard::is-hidden,'
                        'standard::name,standard::display-name,standard::type,'
                        'access::can-execute,standard::size'))
        
            from gio import FILE_TYPE_DIRECTORY, FILE_MONITOR_NONE
            from gio import Error as gioError
            import locale
            
            for info in infos:
                if info.get_is_hidden():
                    continue
                
                name     = info.get_name()
                child    = directory.get_child(name)
                display  = info.get_display_name()
                sortname = locale.strxfrm(display.decode('utf-8'))
                
                if info.get_file_type() == FILE_TYPE_DIRECTORY:
                    subdirs.append((sortname, child, display))
                else:
                    if info.get_attribute_boolean('access::can-execute'):
                        display += '*'
                    size = round(info.get_size() / 1024)
                    size = locale.format_string('%d KiB', size, True)
                    files.append((sortname, child, display, size))
            
            subdirs.sort()
            files.sort()
            
            info = directory.query_info('standard::display-name')
            #self.set_title(info.get_display_name())
            
            self.__liststore.clear()
            parent = directory.get_parent()
            if parent:
                self.__liststore.append((self.HOME_ICON, parent, '<b>../</b>', 
'<dir>'))
                
            for sortname, child, display in subdirs:
                self.__liststore.append((self.FOLDER_ICON, child, '<b>%s</b>' % 
display , '<dir>'))
                
            for sortname, child, display, size in files:
                self.__liststore.append((None, child, display, size))
                
            # monitoruj aktivni adresar kvuli zmenam
            monitor = directory.monitor_directory(FILE_MONITOR_NONE, None)
            monitor.connect('changed', self.__directory_event_changed)
            # program musi byt v Glib main loop aby bral eventy gtk.main() 
nefunguje

        except gioError:
            print' Error listing directory.'
            pass
            
    def __directory_event_changed(self, filemonitor, soubor, other_soubor, 
event_type):
        ' neco bylo zmeneno v aktualnim adresari, vypiseme si ho znova '
        
        from gio import FILE_MONITOR_EVENT_CREATED, FILEMONITOR_EVENT_DELETED
        if (event_type in (FILE_MONITOR_EVENT_CREATED, 
FILEMONITOR_EVENT_DELETED)):
            print soubor, event_type

------------------------------------------------------------------------------------------------
_______________________________________________
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