2017-10-05 2 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를 반환 create_oval 방법을, 실행을 본다. 그래서, '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') 

을 평가 :로 dot1.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]()