와.... 진짜 이거 때문에 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)

여담 : Signal : 신호.. 말 그대로 어떠한 이벤트가 발생했을 때 실행되는 함수라고 보면 되고... Slot : 신호가 발생했을 때 실행되는 함수라고 보면 된다. 같은 소리같이 들리겠지만 실제 구현은 Slot에서 하면 된단 소리다...ㅋㅋ

그래서

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가 출력되었던 것....

 

 

+ Recent posts