Pawang Uler

My experience with python programming language

2009/06/08

Replace duplicate widget name in the glade file

Even in the release notes in Glade Interface Designer stated that duplicate widget name is not allowable in a glade project.
The duplicate widget names are still occur in the glade file.
Some times at the run time gtk builder raise an error about duplicate widget name.

I create a tool to replace a duplicate widget name with appending a postfix after original widget name.


'''
Copyright 2009 Mige Harimurti


This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.


'''



import xml.parsers.expat
import sys


id_list = {}

xml_out = ''

# 3 handler functions

def start_element(name, attrs):
#print 'Start element:', name, attrs
global xml_out
if 'id' in attrs:
if attrs['id'] in id_list:
#print '\t %s duplicate.' % attrs['id']
id_list[attrs['id']] += 1
attrs['id'] = '%s%s' % (attrs['id'],id_list[attrs['id']])
else:
id_list[attrs['id']] = 1
attribute_list = ""
for k in attrs:
attribute_list = '%s %s="%s"' % (attribute_list,k,attrs[k])

xml_out = '%s<%s %s>' % (xml_out,name, attribute_list)

def end_element(name):
#print 'End element:', name
global xml_out
xml_out = '%s</%s>' % (xml_out,name)


def char_data(data):
global xml_out
xml_out = '%s%s' % (xml_out, data)


if __name__ == "__main__":
xml_file = sys.argv[1]
p = xml.parsers.expat.ParserCreate()

p.returns_unicode = False
p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data

xfo = open(xml_file)

xml_out = '<?xml version="1.0"?>\n'
p.ParseFile(xfo)
print xml_out

#~ for k in id_list:
#~ if id_list[k] > 1:
#~ print "%s:%s" % (k,id_list[k])

2004/05/18

PyGTK TextBuffer

TextMark :
Untuk menandai suatu posisi di dalam textbuffer.

Iterator dalam TextBuffer tidak didefinisikan sebagai object/class tertentu. Berfungsi sebagai penunjuk (pointer) suatu posisi dalam TextBuffer.
Method insert :
- menggunakan iterator sebagai penunjuk posisi awal suatu string disisipkan ke dalam TextBuffer
- setelah insert, iterator di-invalidasi tetapi oleh default event-handler di ubah nilainya sehingga menunjuk ke posisi akhir setalah proses insert dilakukan.

Bedanya iterator dengan TextMark, iterator berubah setiap kali ada perubahan isi TextBuffer sedangkan TextMark akan tetap menunjuk ke posisi dimana TextMark di-set terakhir walaupun isi TextBuffer berubah.

PyGTK 2 Tutorial

I have a little tutorial about PyGTK 2 in Bahasa Indonesia.

Selamat datang di (wellcome to) : http://www.geocities.com/mige_harimurti/gtk2python

PyGTK TreeIter object

Gimana cara create object gtk.TreeIter di pygtk ?
Saya lihat di source-code pygtk terdapat pygtktreemodel.c dan pygtktreemodel.h.
Sepertinya terlihat kita hanya perlu return node (object) untuk method-method yang resultnya TreeIter.
Dan handler interfacenya yang akan men-set node itu ke private_data dari object TreeIter.
Kalo kita bikin class turunan gtk.GenericTreeModel maka perlu implement beberapa method yang resultnya TreeIter atau menerima parameter dengan tipe gtk.TreeIter. Untuk parameter dengan tipe gtk.TreeIter, parameter dapat kita gunakan seperti halnya object-row. Untuk result dengan tipe gtk.TreeIter maka kita dapat return object-rownya.
TreeeIter == node / row, hanya berlaku di dalam callback function dari implementasi gtk.GenericTreeModel. Di luar itu tetap terlihat sebagai gtk.TreeIter.