Python 循环按钮,忘记按钮值

Python 循环按钮,忘记按钮值,python,tkinter,Python,Tkinter,我正在用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'

我正在用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)
它的循环非常好,我的按钮也被创建了,但是当我按下一个按钮时,如果设置vas为“正常”,我总是得到-as值。这是因为“key”的最后一个值是-。如果我将其设置为caps,它总是在文本字段后面附加x


在这种情况下,如何设置command=lambda:AppendKeythis按钮值?

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)

值得注意的是,像这样的if/elif长字符串最好用字典来代替。如果在for循环中需要索引键计数器,只需使用enumerateYea Daniel i,我认为有更好的方法来计算列。谢谢啊,酷!谢谢你的字典解答。看起来好多了