2014-11-07 4 views
0

python Tkinter를 사용하여 GUI 프로그램을 디자인하고 있습니다. 클래스 구조로 개발하면 각 클래스에는 위젯이 포함 된 프레임이 포함되어 있습니다. 문제는 한 클래스가 다른 클래스의 위젯을 인수로 필요로하므로 다른 클래스도 마찬가지입니다. 클래스를 인스턴스화하는 방법이 혼란 스럽습니다. 지금까지 시도한 코드는 다음과 같습니다.인스턴스화시 한 클래스의 위젯을 다른 클래스로 전달

frame1 = infoframe(lambda : frame2.listbox1) 
frame2 = scriptframe(frame1.entry1) 

내가 인수로 frame2.listbox1 필요 프레임 1에있는 함수를 호출 할 때마다, 함수는 목록 상자로 frame2.listbox1를 인식하지 못합니다. 나는 또한이 코드를 시도했다 :

frame1 = infoframe(None) 
frame2 = scriptframe(frame1.entry1) 
frame1['object'] = frame2.listbox1 

그래도 운이 없다. 나는 프로그램이 잘 조직되도록 수업 구조로 프로그램을 만들지 만 생각만큼 간단하지는 않은 것 같습니다.

답변

0

단위 사이의 의존성 그래프가 비순환이되도록 코드를 단위로 분해해야합니다. 이렇게하면 일반적으로 나쁜 스타일로 간주되는 작업을 수행해야 할 수 있습니다.

파이썬이 어떻게 'a'와 'b'와 같은 두 모듈이 서로를 가져올 수 있는지 생각해 봅시다. 주 모듈이 import a으로 시작한다고 가정합니다. sys.modules['a']의 존재 여부를 확인한 후 가져 오기 코드가 '명백한'sys.modules['a'] = module('a', code_of_a)을 실행하면 모듈 호출이 반환 될 때까지 sys.modules에 아무 것도 추가되지 않습니다. 반환 전 수입 b와 b가 수입을 시도 할 때 sys.modules['a']이 존재하지 않으며 재연 한계에 도달 할 때까지 sys.modules['a'] = module('a', code_of_a)이 반복됩니다.

대신 모듈 가져 오기를 가져 오면 가져 오기가 두 단계로 분리됩니다. 이것은 거의 빈 모듈을 sys.modules['a'] = module('a') 같은 것으로 sys.modules에 넣는 것으로 시작됩니다. 그런 다음 sys.modules['a'].populate(code_of_a)과 같은 것을 호출합니다. 초기화되지 않은 객체를 노출하는 것은 일반적으로 나쁜 스타일로 간주되지만 여기서 필수적입니다. 이것은 당신이 시도했던 것과 같은 생각입니다.

이제 import b를 실행하면 모듈 a는 이전 명령문에서 정의 된 객체를 갖게됩니다. b가 a를 가져 오면 부분적으로 초기화 된 모듈을 가져옵니다. 사용자는 단지 import b 이전에 초기화 될 필요가있는 것이 무엇이든간에, 'a_before'와 'a_after'로 나누는 것이 의존성주기를 깨뜨릴 수 있도록 정렬해야합니다. 파일 중간에 import b을 넣으면 PEP8 권고에 위배되며 맨 위에 가져 오기가 있지만 상호 가져 오기를 위해 파일 중 하나에서 작동해야합니다.

대체 솔루션은 코드를 a와 b에서 처음 초기화 된 새 모듈로 옮기는 것입니다.

귀하의 상황에 맞는 아이디어가 있기를 바랍니다.

관련 문제