[PySide2] 람다 함수와 반복문을 이용하여 버튼 인자 설정하기
와.... 진짜 이거 때문에 3시간 날린 듯...ㅋㅋㅋ
문제의 시작은 이랬다....
0~9까지의 버튼을 만드는데
self.button0.clicked.connect(lambda idx: self.setNumber(0))
self.button1.clicked.connect(lambda idx: self.setNumber(1))
self.button2.clicked.connect(lambda idx: self.setNumber(2))
self.button3.clicked.connect(lambda idx: self.setNumber(3))
self.button4.clicked.connect(lambda idx: self.setNumber(4))
...
def setNumber(self, num):
print(num)
이런식으로 만들려고 했다.
하지만 아무리봐도 저렇게 무식하게 다 쓰는건 폼이 안난다.
그래서 좀 더 뒤져보니
for문과 list를 이용해 좀 더 깔쌈하게 짜는 법이 있어서 그 방법으로 해보기로 했다.
self.button_list = [self.button0, self.button1, self.button2, self.button3, self.button4, self.button5, self.button6, self.button7, self.button8, self.button9]
for i, btn in enumerate(self.button_list):
btn.clicked.connect(lambda stat, idx=i: self.setCarNumber(stat, idx))
def setCarNumber(self, stat, num):
print(num)
button 리스트를 만들어주고 clicked가 지 상태를 반환한다고 해서 쓰지도 않을 stat 인자와 실제 필요한 idx인자를 이용해서 깔쌈하게 짜보기로...
TypeError: () missing 1 required positional argument: 'stat' ...?
에러가 나네.... stat인자가 없다고..?
lambda [매개변수] : [식] 이런 식으로 구현하는거 맞지 않니..?
그래서 정말 여러가지 시도를 해봤다... 나는 람다 함수를 잘 모르니깐!!! ㅋㅋㅋ
하지만 문제를 해결하고 나니 원인을 알 수 있겠더라..ㅋㅋ
해결
일단 PySide2의 clicked() 함수는 2종류다. 바로 clicked()와 clicked(bool)
그래서
btn.clicked.connect(lambda idx=i: self.setCarNumber(idx))
이런식으로 선언을 하면 clicked(bool)에 의해서 idx가 False값이 들어가버린다..ㅋㅋㅋ
즉, clicked를 이용해서 내가 원하는 구현을 하고 싶으면 일단 stat를 놓고, idx를 추가하면 된다.
btn.clicked.connect(lambda stat=False, idx=i: self.setCarNumber(idx))
이런식으로 말이다..ㅋ
개 웃긴게 매개변수 2개를 반환하는 clicked는 없어서 stat만 쓰면 인자가 없다고 쌩난리를 피는 것...
아 그리고 이런 문제도 경험했다.
#안되는 것
btn.clicked.connect(lambda idx: self.setCarNumber(i))
이건 안되고(어떤 버튼을 누르던 출력이 9가 나온다 ㅋㅋ)
#되는 것
self.button0.clicked.connect(lambda idx: self.setNumber(0))
이건 되고..ㅋㅋㅋ
진심 개빡쳤었다..ㅋㅋ
지금 돌이켜보면 내가 람다 함수를 잘 몰랐던 것과... 저 connect가 한 번 연결시켜놓으면 계속 그 상태를 불러오는게 아니라 lambda idx: self.setNumber(i)를 불러오는거라서 계속 i의 최종 값인 9가 출력되었던 것....