簡體   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