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/