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