2012-02-22 5 views
1

짧은 시간 이래로 Python을 배우고 있다는 것을 지적하고 싶습니다. 질문은 초보자가 될 것입니다."command"및 "bind"에 인수가있는 함수 호출

나는 "("적색) color_picker "함수를 호출 할 것이다, 프로그램의 상단에있는 메뉴에 명령을 추가해야합니다.

kolory.add_command(label="Czerwony", command=color_picker('red')) 내가 사용하는 경우, 자사의 어떻게 든 잘못, 그 프로그램 일단라는 사촌 시작, 그 나를 위해 메뉴 버튼을 클릭 기다리고 (나는 그 기능에 "showinfo"를 추가하고, 내가 아무것도하기 전에 메시지를 보여줍니다.) kolory.add_command(label="Czerwony", command=lambda: color_picker('red')) 그 중 하나는 작동하지만, 나는 돈을 여기에 "lambda"가 무엇을 의미하는지 알지 못합니다. 메뉴 옵션에서 인수를 사용하여 함수를 호출하는 유일한 방법입니까?

같은 질문은 제본 용 키보드로갑니다. 바로 가기. okno.bind("1", color_picker) - 함수를 호출하지만 인수가 없으므로 색상이어야합니다. 내가 어떻게 할 수 있니?

그래서 인자를 가진 함수를 키보드 단축키와 add_command를 사용하여 메뉴에 할당하는 방법은 무엇입니까?

추신. 물마루 구글 검색했지만 python이 C#과 같은 좋은 문서를 가지고 있지 않은 것 같습니다. 또는 나는 그것을 찾기에는 너무 어리 석다.

편집 : 오류 메시지 그게

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__ 
    return self.func(*args) 
TypeError: color_picker() takes at most 1 argument (2 given) 

, 내가 사용하려고하면 내가 질문을 이해한다면 모르겠지만, 여기에 표시됩니다 okno.bind

+1

파이썬 문서가 도움이'를 통해 액세스 할 수 있습니다 () '함수 대화 형 파이썬 셸. 귀하의 경우 도움이'kolory.add_command' 아마 당신이 찾고있는 설명서입니다. – Kimvais

답변

3

에서 "pick_red";

문제는 사용자가 (기능 이름 뒤에 ()을 추가하여) 기능을으로 호출하는 것입니다. 당신이 원하는 무엇

는 실제 기능, 예를 들어, command 키워드 인수로 함수 호출하지 결과을 통과하다당신이 그것을 고정 인수 'red'을주고 싶어하기 때문에 add_command(label="Czerwony", command=color_picker)

그러나, 당신은 functools에서 partial를 사용해야합니다, 뭔가 같은;

from functools import partial 
pick_red = partial(color_picker, "red") 
kolory.add_command(label="Czerwony", command=pick_red) 

편집 :

이 오류 메시지가 당신이 Tkinter을 사용하고 있는지 보여줍니다 이제

, 우리가 bind()에 부여되는 따라 documentation의 기능을 볼 수는 항상 그래서 event 매개 변수를 전달 그것을 받아 들일 수있는 기능이 필요하다. 당신이 위와 같이 pick_red을 정의한 경우

def pick_red_with_event(event): 
    # We really do nothing with event for now but we always get it... 
    color_picker("red") 

okno.bind("1", pick_red_with_event) 

같은 일이 바로 수행 okno.bind 작동 :

okno.bind("1", pick_red) 

+0

예, 당신은 아주 잘 이해했습니다. 그게 내가 의미했던 바로 그거야. 그것은 add_command와 잘 작동하지만 bind에 대한 에러를 내게줍니다. 내 게시물에 오류 메시지를 게시 할 것입니다. – Kedor

+0

re : "functools에서 부분을 사용해야합니다"- 그 문장은 약간 잘못되었습니다. 반드시 사용해야 할 이유는 없지만 확실히 사용할 수는 있습니다. 람다를 사용할 수도 있습니다. 이 대답은 functools.partial이 유일한 해결책이라는 인상을줍니다. –

관련 문제