我正在为一个要求参与者学习新的数字键盘映射的心理学实验编写程序。
如果键是字母,那就很容易了:
a=1
, b=2
,c=3
等等。
但显然 Python 不允许映射到整数。唔。
部分解决方案可能是使用字典,例如:
newdict = {'1': 9, '2': 8, '3': 7}
但是,参与者将在文本框中输入,当他们的输入出现在框中时,它需要已经转换。没有明确的方法来应用newdict['1']
调用。
这种重新映射如何实现?
我正在为一个要求参与者学习新的数字键盘映射的心理学实验编写程序。
如果键是字母,那就很容易了:
a=1
, b=2
,c=3
等等。
但显然 Python 不允许映射到整数。唔。
部分解决方案可能是使用字典,例如:
newdict = {'1': 9, '2': 8, '3': 7}
但是,参与者将在文本框中输入,当他们的输入出现在框中时,它需要已经转换。没有明确的方法来应用newdict['1']
调用。
这种重新映射如何实现?
您使用 dict 的直觉很好——这是一种创建从一个角色到另一个角色的映射的简单方法。您也可以只使用元组列表(例如((1, 9), (2, 8), ...)
:)
你没有提到 GUI 工具包(或者你是否只是在做一个控制台应用程序),所以我将给出一个 tkinter 示例来说明如何使用字典为每个键设置键绑定。使用元组几乎是相同的。
import tkinter as tk # for python 2 use 'Tkinter'
class Example(tk.Frame):
keymap = {'1': '9', '2': '8', '3': '7',
'4': '6', '5': '5', '6': '4',
'7': '3', '8': '2', '9': '1'}
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.entry = tk.Entry(self, width=20)
self.entry.pack(fill="x", pady=20, padx=20)
for old_key, replacement in self.keymap.items():
self.entry.bind('<KeyPress-%s>' % old_key,
lambda event, char=replacement: self.insert(char))
def insert(self, char):
self.entry.insert("insert", char)
return "break"
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()