我试图用openGL非常聪明,并按逻辑顺序将所有函数及其变量存储在字典中,然后稍后按功能顺序调用它们。
def complex_draw_square(width, height, x=0, y=0, z=0, x_angle=0, y_angle=0, z_angle=0,):
action_dict = {
glPopMatrix: "E",
glRectf: (0, 0, width, height),
glTranslatef: (0, -height, 0),
glRotatef: (x_angle, y_angle, z_angle, 1),
glTranslatef: (x, y + height, z),
glPushMatrix: "E"
}
return action_dict
问题是,当我尝试这样做时,我得到了文件
"/Users/lego90511/PycharmProjects/OpenGLDummy/opengl_shortcuts.py", line 9, in complex_draw_square
glPopMatrix: "E",
TypeError: unhashable type
无论我有哪种功能变量组合,我都会得到这个。奇怪的是,我在终端中尝试使用自定义功能
def sum(x,y):
return x + y
d = {sum: (1, 2)}
for f in d.keys():
print f(*d[f])
>>>3
这很有效。那么为什么另一个不起作用?
答案 0 :(得分:2)
鉴于您希望项目保留其顺序,并且您的示例中包含重复的键(glTranslatef
),因此Python词典不适用于此。
为什么不使用列表或元组:
actions = [
(glPopMatrix, "E"),
(glRectf, 0, 0, width, height),
(glTranslatef, 0, -height, 0),
(glRotatef, x_angle, y_angle, z_angle, 1),
(glTranslatef, x, y + height, z),
(glPushMatrix, "E")
]