我正在使用自己的某种屏幕键盘"在python / tkinter中。
我有这样的代码:
def GetKeyRow(self, num, set):
if set == 'normal':
if num == 1:
return ['1', '2', '3', '4', '5', '6' ,'7', '8', '9' ,'0', '+']
elif num == 2:
return ['q', 'w', 'e', 'r', 't', 'y', 'u' ,'i', 'o', 'p']
elif num == 3:
return ['a', 's', 'd', 'f', 'g', 'h', 'j' ,'k', 'l', "'"]
elif num == 4:
return ['<', 'z', 'x', 'c', 'v', 'b', 'n' ,'m', ',', '.', '-']
elif set == 'caps':
if num == 1:
return ['!', '"', '#', '$', '%', '&', '/', '(', ')', '=', '?']
elif num == 2:
return ['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P']
if num == 3:
return ['A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', '*']
if num == 4:
return ['>', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ';', ':', '_']
def RenderKeys(self, keyset):
for btnRow in range(1,5):
row = self.GetKeyRow(btnRow, keyset)
keyCounter = 0
for key in row:
btn = Button(self.Level, text=key, command=lambda:self.AppendKey(key), font=("Helvetica", 16), width=3, height=2)
btn.grid(row=btnRow + 2, column=keyCounter)
keyCounter += 1
def AppendKey(self, value):
self.InputFiled.insert(END, value)
它循环非常好,我的按钮被创建,但当我按下按钮时,我总是得到&#34; - &#34;作为价值(如果设定的血管&#39;正常&#39;)。这是因为&#39;键&#34;的最后一个值是&#34; - &#34;。如果我将它设置为大写,它总是将文本附加到&#34; _&#34;。
在这种情况下,如何设置command = lambda:AppendKey(此按钮值)?
答案 0 :(得分:2)
lambda中使用的变量不是固定的,而是随着定义lambda的上下文而变化。你可以写下:
来防止这种情况command = lambda key=key: self.AppendKey(key)
然后你得到类似的东西:
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)