2017-10-05 70 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]()