The variables, used in a lambda are not fixed, but change with the context, where the lambda is defined. You can prevent this by writing:
command = lambda key=key: self.AppendKey(key)
Then you get something like that:
KEYROWS = {
'normal': [
'1234567890+',
'qwertyuiop',
"asdfghjkl",
'<zxcvbnm,.-',
],
'caps': [
'!"#$%&/()=?',
'QWERTYUIOP',
'ASDFGHJKL*',
'>ZXCVBNM;:_',
],
}
def RenderKeys(self, keyset):
rows = self.KEYROWS[keyset]
for row,keys in enumerate(rows):
for col, key in enumerate(keys):
btn = Button(self.Level, text=key, command=lambda key=key:self.AppendKey(key), font=("Helvetica", 16), width=3, height=2)
btn.grid(row=row + 2, column=col)
def AppendKey(self, value):
self.InputFiled.insert(END, value)