2017-10-05 7 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 

コードは実行されますが、出力が期待どおりではありません。関数に渡された* argsの値は、

'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': c.create_oval(x, y, x + r, y + r, fill='black') 

これはを評価されますようdot1c.create_oval()関数は何も返しませんので、Noneを返します。この値は辞書に格納されます。

draw_dice()を実際に呼び出すまで、これらの呼び出しの実行を延期したいと思われます。これを行うには、辞書項目の値を関数にする必要があります。

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

そして、あなたはあなたの引数を反復処理する場合、関数を呼び出す:

for arg in args: 
    dots[arg]() 
これを行うための最も簡単な方法は、1行無名関数を定義するために lambdaを使用することです
関連する問題