从字典值

时间:2017-10-05 15:56:55

标签: python dictionary

一切!作为我的个人项目,我试图将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等。

有些奇怪的事情正在发生,但我怀疑我可能错误地使用这种数据结构。任何帮助将不胜感激!

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]()