how can I do this?
John Hunter
jdhunter at nitace.bsd.uchicago.edu
Mon Jul 15 19:28:06 EDT 2002
>>>>> "Eric" == Eric Yohanson <eay at oclearnet.com> writes:
Eric> I would like to know if it is possible in python 2.21 to
Eric> make a text entry widget that initially show nothing but
Eric> when the user type the first character displays a template
Eric> like "00#00:01+2" for the previous I have only enter the
Eric> numbers 1 & 2. the numbers would need to enter from right
Eric> and travel to the left as more are entered replacing the "0"
Eric> place holders. How difficult would this be to do and what
Eric> should my approach be to this. Any help wuld be great.
Getting sinlge chars in python is platform and GUI dependent (search
for getchar on groups.google.com in comp.lang.python for some
suggestions).
But assuming you can get the chars, here is some code that will do the
template substitution. I use a list of chars as input. I found it
easier to do this by first flipping the template string from left to
right and using python's index function, which searches from the left.
import string
def fliplr(s):
"flip the string s from left to right"
out = ''
for i in range(len(s)-1, -1, -1):
out += s[i]
return out
def replchars(template, chars, token='0'):
"replace the kth instance of token in template with chars[k]"
out = map(None, template) # out is a list of chars in template
for c in chars:
ind = out.index(token)
if ind==-1:
raise ValueError, 'Could not find token %s in template'
out[ind] = c
return string.join(out, "")
template = "00#00:00+0"
chars = ['1', '2', '3', '4', '5', '6', '7']
rtemplate = fliplr(template)
for i in range( len(chars) ):
rchars = fliplr( chars[0:i+1] )
print fliplr( replchars( rtemplate, rchars) )
The output is:
00#00:00+1
00#00:01+2
00#00:12+3
00#01:23+4
00#12:34+5
01#23:45+6
12#34:56+7
Here's a shorter, but possibly more obscure version:
import string
def rsub(template, chars, token='0'):
out = map(None, template)
# get the indicies of the tokens in reverse order
inds = [ i for i in range(len(template)-1, -1, -1) if template[i]==token]
N = len(chars)
for i in range( len(chars) ):
out[inds[i]] = chars[N-i-1]
return string.join(out, "")
template = "00#00:00+0"
chars = ['1', '2', '3', '4', '5', '6', '7']
for i in range( len(chars)) :
print rsub(template, chars[0:i+1])
HTH,
JDH
More information about the Python-list
mailing list