저는 파이썬의 tkinter
모듈에 익숙하지 않으므로 모든 도움에 감사 드리며 이유가 무엇인지에 대한 설명도 있습니다.lambda 명령을 사용할 때 Python tkinter NameError
다음과 같은 형태의 4 튜플 목록이 있습니다. (foo, bar, x, y)
; 이런 일 : 적 기능을 갖는 각각의 버튼, 텍스트 bar
와 버튼으로 가변 foo
인스턴스화
TUPLE_LIST = [('Hello', 'World', 0, 0),
('Hovercraft', 'Eels', 50, 100),
etc.]
나중에 for
루프 그리고, 행 각각 bar
이미 정의 된 그 장소 Entry
위젯을 추가 공동 좌표 x, y
에서 그것을 :
for foo, bar, x, y in TUPLE_LIST:
exec("{0} = Button(self, text='{1}', command=lambda: self.update_text('{1}'))".format(foo, bar))
eval(name).place(x=x, y=y)
버튼 장소 완벽하지만, 내가받을 다음과 같은 오류 발생 중 하나를 클릭로 이동하는 경우 :
Traceback (most recent call last):
File "...\lib\tkinter\__init__.py", line 1550, in __call__
return self.func(*args)
File "<string>", line 1, in <lambda>
NameError: name 'self' is not defined
나는 명령이 람다 (lambda)로 정의되어 있고 정의 된 '함수'가 아니라는 것을 짐작할 수있다. 그러나 나는 다른 사람들이 자신의 버튼을 정의하는 것을 보았다. 람다와 명령. 그래서 exec
도 사용하는 것과 관련이 있습니까? (이 중요한 경우) 또한, 여기 update_text
에 대한 코드는 다음과 같습니다
def update_text(self, new_char):
old_str = self.text_box_str.get()
# Above is a StringVar() defined in __init__ and used as textvariable in Entry widget creation.
self.text_box_str.set(old_str + new_char)
어떤 도움이 많이 주시면 감사하겠습니다. 미리 감사드립니다.
확인과 그 4 개 라인을 대체 할 수 있지만, 여전히 원래의 문제가 해결되지 않습니다. 그런 다음 어떻게 각각의 버튼이'Entry' 위젯에 자신의'bar '를 추가하는'command'를 갖도록 그런 방식으로 버튼을 만들까요? 왜냐하면 나는'exec' 호출에서 문자열 형식화 이외의 다른 방법을 생각할 수 없기 때문에 문제를 일으키는 것으로 보입니다. 그리고 예, 저는 수업을 사용하고 있습니다 (그러나 문제를 일으키는 '자아'는 나의 것조차도 아닙니다.). – ENPM
@ENPM : 생성 된 문자열에'exec'를 호출하는 것이 사실상 불가능합니다.함수를 호출하고 업데이트 할 위젯을 전달하는 방법을 보여주기 위해 내 대답을 업데이트했습니다. 이 함수는 위젯 이름을 알 필요가 없으며 위젯 자체에 대한 참조를 제공 할 수 있습니다. –
좋습니다, 감사합니다! 대신 그걸 줄께. – ENPM