루프에서 PyQt4의 슬롯과 신호 연결: 바인딩 체인 끊기
이 기사에서는 연결 중에 발생하는 일반적인 문제를 해결합니다. PyQt4의 루프 내에서 생성된 버튼의 clicked() 신호입니다. 우리는 각 버튼이 해당 레이블에 따라 고유한 작업을 실행해야 한다는 기대에도 불구하고 왜 모든 버튼이 동일한 값을 인쇄하는지 이해하는 것을 목표로 합니다.
범위 지정 및 종료 이해
제공된 예제에서 관찰된 동작은 Python의 범위 지정 및 폐쇄 메커니즘의 결과입니다. 루프 내부에 버튼을 생성할 때 clicked() 신호를 람다 함수에 연결하려고 합니다. 그러나 Python은 함수의 할당이나 매개변수 목록을 통해서만 네임스페이스에 새 바인딩을 도입합니다.
따라서 람다 함수에는 루프 변수 i에 대한 자체 바인딩이 없고 대신 다음 네임스페이스에서 찾습니다. 둘러싸는 함수 __init__(). 람다가 실행될 때 i에는 이미 최종 값 9가 할당되어 모든 버튼에 동일한 출력이 인쇄됩니다.
해상도
주소 이 문제에서는 i를 기본값과 함께 키워드 인수로 람다 함수에 전달할 수 있습니다. 이는 람다 내의 i가 __init__()의 i와 독립적임을 보장합니다. 또는 동일한 결과를 얻기 위해 더 읽기 쉽고 "마법"이 덜한 접근 방식을 제공하는 functools.partial 함수를 사용할 수 있습니다.
키워드 인수의 예:
예제 functools.partial:
이러한 접근 방식 중 하나를 구현하면 각 버튼과 해당 동작 사이에 원하는 바인딩을 성공적으로 설정할 수 있습니다.
위 내용은 루프에 연결되면 내 PyQt4 버튼이 모두 동일한 값을 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!