[英]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.