> 백엔드 개발 > 파이썬 튜토리얼 > Tkinter 버튼 명령에 루프 변수를 올바르게 전달할 수 있는 방법은 무엇입니까?

Tkinter 버튼 명령에 루프 변수를 올바르게 전달할 수 있는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-24 17:56:10
원래의
168명이 탐색했습니다.

How Can I Pass Loop Variables Correctly to Tkinter Button Commands?

Tkinter 버튼 명령에 루프 변수 전달

Tkinter에서는 루프에 버튼을 만드는 것이 간단할 수 있습니다. 그러나 각 버튼의 명령에 특정 인수를 전달하는 것은 까다로울 수 있습니다.

제목이 "게임 1"부터 "게임 3"까지인 3개의 버튼을 생성하려고 하는 다음 시나리오를 고려해 보세요. 버튼을 눌렀을 때 어떤 버튼이 작업을 실행했는지 식별할 수 있도록 해당 숫자 값을 명령 인수에 전달하려고 합니다.

def createGameURLs(self):
    self.button = []
    for i in range(3):
        self.button.append(Button(self, text='Game '+str(i+1),
                                  command=lambda: self.open_this(i)))
        self.button[i].grid(column=4, row=i+1, sticky=W)

def open_this(self, myNum):
    print(myNum)
로그인 후 복사

안타깝게도 이 코드는 의도한 대로 작동하지 않습니다. 아무 버튼이나 누르면 인쇄된 값은 항상 루프의 마지막 반복인 2입니다. 문제는 람다 함수가 각 버튼을 생성할 때의 값이 아니라 루프 끝에서 i 값을 사용하기 때문에 발생합니다.

폐쇄의 기적

이 문제를 해결하려면 각 버튼의 명령 주위에 클로저를 만들어야 합니다. 이는 람다 i=i 구문을 사용하여 달성할 수 있습니다: self.open_this(i).

def createGameURLs(self):
    self.button = []
    for i in range(3):
        self.button.append(Button(self, text='Game '+str(i+1),
                                  command=lambda i=i: self.open_this(i)))
        self.button[i].grid(column=4, row=i+1, sticky=W)
로그인 후 복사

이 수정을 통해 각 버튼의 명령은 생성 당시의 특정 i 값을 캡처합니다. 버튼을 누르면 클로저는 올바른 i 값이 open_this 함수에 전달되도록 보장합니다.

위 내용은 Tkinter 버튼 명령에 루프 변수를 올바르게 전달할 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿