2017-10-05 35 views
0

所有检索功能!作为我的个人项目,我试图将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 

该代码运行,但输出不符合预期。对于传递给函数的*参数,选择值可以是:

'dot0','dot1'...,'dot9' 或者只是'dot1'。

在我的另一个功能,我追加返回的C(画布),以将通过各种创建骰子洗牌列表面向动画滚动骰子。

但是,这不是问题。问题来自这个功能。运行调试后,我发现,每个键的值是这样的:

“dot0”:无,“DOT1”:1,“DOT2”:2,等

一些奇怪的是继续,但我怀疑我可能会错误地使用这个数据结构。任何帮助将不胜感激!

回答

1

正因为如此,该字典不具备的功能,它有已经被调用函数的输出。

在时刻解释看到线

'dot1':c.create_oval(x, y, x + r, y + r, fill='black') 

实际上它运行的​​方法,它返回一个自增整数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

您已经定义了例如dot1为:

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