[Tutor] Dictionary blues...

Igor Riabtchuk igor.r at vodafone.net
Thu Mar 24 00:51:21 CET 2005


My deepest and most sincere apologies - cooking dinner for the family and 
posting questions do not mix, I keep making mistakes in the code I type. 
Once again my apologies - here's the code as it is in my source:

import sys, os, unicodedata
from Tkinter import *

class CRED(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.txt=Text(self)
        self.txt.bind('<Key>', self.conv)
        self.txt.pack()
        self.pack()
        self.txt.focus()

    def conv(self,event):
        if event.keysym=='t':
            str='p'
        self.txt.insert(END,str)
        return 'break'

app=CRED()
app.mainloop()

This works - i.e. when I press 't' on the keyboard, it gives me 'p'. What I 
want to do is, instead of coding a conversion for each letter separately 
using a long "if.... elif" sequence, to put all the conversion values into 
the dictionary and then a general function for each keypress that would take 
the values out of the dictionary.

E.g. - say I have dictionary D={'p':'t','t':'z'}

Instead of coding the conv function for each letter:

if event.keysym=='p':
    str='t'
elif event.keysym=='t':
    str='z'

put all the conversion values into a dictionary and make the function use 
the key:value pairs from dictionary.

I hope I am making sense.

Igor



----- Original Message ----- 
From: "Alan Gauld" <alan.gauld at freenet.co.uk>
To: "Igor Riabtchuk" <igor.r at vodafone.net>; <tutor at python.org>
Sent: Wednesday, March 23, 2005 11:17 PM
Subject: Re: [Tutor] Dictionary blues...


> Igor,
>
>> I posted the wrong code before. The code is:
>
> Is this the actual code you have written? If so it is
> so far from being working code that it suggests you
> need to back up a little and work at the basics of
> Python before trying to tackle Tkinter and GUIs.
>
> I'll assume this really is your code and make some
> comments...
>
>> from Tkinter import *
>>
>> D={a:"tom", b:"dick", c:"harry"}
>
> You need to put the keys in quotes too
>
>> text.bind('<Key>', self.Conv)
>
> self is only used to access the members of a class,
> you don't have any class so you don't need self.
> You also don't, at this stage, have anything called
> 'text' so you can't bind anything to it. You need to
> create a text widget which in turn it parented under
> a Tk object
>
> top = Tk()
> text = Text(top)
> text.bind('<Key>', Conv)
>
> But even here, Conv hasn't been defined yet so you
> need to move the Conv definition above those lines.
>
>> def Conv(self,event):
>
> You can remove the self fro the parameter list, its
> only needed if this is a method of a class.
>
>>    if D.has_key(event.keysym):
>>      str=D[event.keysym]
>>    self.text.insert(END,str)
>
> You can remove the 'text.' thats only used if text
> were part of a class, which in this case it isn't.
> Also you probably want to indent the insert line as
> part of the if clause.
>
>>    return 'break'
>
> And before anything works you need to 'pack' the text
> widget and set the event loop running:
>
> text.pack()
> top.mainloop()
>
>> The error message says wrong syntax...
>
> I'm sure it said a lot more than that. Please send the
> whole error message, the bit that tells us what exactly
> Python thought was wrong and where. In this case there
> is so much that is wrong it doesn't matter too much but
> in future it will be important. The more you help us
> the more we can help you.
>
> If the above doesn't make sense can I suggest you try
> building a textual version first using the dictionary
> and raw_input to read the keys from the console. Once
> you have the basics working putting it into a GUI will
> be much easier.
>
> Alan G
> Author of the Learn to Program web tutor
> http://www.freenetpages.co.uk/hp/alan.gauld
>
> 




More information about the Tutor mailing list