一切!作为我的个人项目,我试图将tkinkter中的骰子滚动动画从仅使用if语句转换为字典值。我基本上是这样做的:
def draw_dice(*args):
w,h = 23, 23
x,y,r = 2,2,5
c = tk.Canvas(root,width=w,height=h,bg='white')
dots = {
'dot0':None,
'dot1':c.create_oval(x, y, x + r, y + r, fill='black'),
'dot2':c.create_oval(x + 16, y, (x + 16) + r, y + r, fill='black'),
'dot3':c.create_oval(x, y + 8, x + r, (y + 8) + r, fill='black'),
'dot4':c.create_oval(x + 8, (y + 8), (x + 8) + r, (y + 8) + r, fill='black'),
'dot5':c.create_oval(x + 16, (y + 8), (x + 16) + r, (y + 8) + r, fill='black'),
'dot6':c.create_oval(x, y + 16, x + r, (y + 16) + r, fill='black'),
'dot9':c.create_oval(x + 16, y + 18, (x + 16) + r, (y + 16) + r, fill='black')
}
for arg in args:
dots.get(arg)
return c
代码运行,但输出不符合预期。对于传入函数的* args,选择值可以是:
'dot0','dot1'......,'dot9' 或者只是'dot1'。
在我的另一个函数中,我将返回的c(画布)附加到一个列表中,该列表将在各种创建的骰子面上随机播放以设置滚动骰子的动画。
但是,这不是问题。问题来自这个功能。运行调试器后,我发现每个键的值都是这样的:
'dot0':无,'dot1':1,'dot2':2等。
有些奇怪的事情正在发生,但我怀疑我可能错误地使用这种数据结构。任何帮助将不胜感激!
答案 0 :(得分:1)
实际上,字典没有函数,它具有已经被调用的函数的输出。
当口译员看到
行时 'dot1':c.create_oval(x, y, x + r, y + r, fill='black')
它实际上运行create_oval
方法,该方法返回椭圆的自动递增整数id。那么,在那之后'dot1': 1
如果你希望它是一个功能,你可以做一些像
'dot1': lambda x, y, r: c.create_oval(x, y, x + r, y + r, fill='black')
所有dotX
键的相同内容。然后,您可以通过
for arg in args:
dots.get(arg)(x, y, r)
答案 1 :(得分:1)
您已定义,例如dot1
as:
'dot1': c.create_oval(x, y, x + r, y + r, fill='black')
在创建词典时会对进行评估。 c.create_oval()
函数不返回任何内容,因此返回None
。该值存储在字典中。
据推测,您希望在实际调用draw_dice()
之前推迟执行这些调用。为此,您需要设置字典项功能的值。最简单的方法是使用lambda
来定义一行匿名函数:
'dot1': lambda: c.create_oval(x, y, x + r, y + r, fill='black')
当你遍历你的参数时,调用函数:
for arg in args:
dots[arg]()