繁体   English   中英

从字典值中检索函数

[英]Retrieving functions from dictionary values

所有! 作为我的个人项目,我尝试将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,等等。

发生了一些奇怪的事情,但是我怀疑自己可能使用了错误的数据结构。 任何帮助将不胜感激!

实际上,字典没有功能,它具有已被调用的功能的输出。

当时口译员看到了

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

您已将例如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]()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM