2013-08-18 2 views
1

저는 tkinter 캔버스를 만들고 있는데, 사용자가 창 크기를 변경할 때를 확인해야합니다. 문제는 처음에 창은 분명히 예상되는 크기가 아니라는 것입니다. tkinter 루트 창 크기가 맞지 않습니다.

def print_size(self): 
    print self.root.winfo_width() 

def init_simulation(self, size=300): 
    self.root = Tk() 
    canvas = Canvas(self.root, width=size, height=size) 
    self.print_size() 
    self.root.after(1000, self.print_size) 

이 실행

내가 얻을 :

1 

이후 두 번째 : 나는 다음이

306 

Tkinter를 6 개 픽셀을 추가 할 것이라는 사실을 무시하는 이유입니다 크기는 처음 1, 그 다음에 306? 나는 그것을 잘못 설정하고 있습니까?

답변

2

루트 위젯을 Tk()으로 인스턴스화하면 Tkinter는 별도의 스레드에서 프로세스를 시작하여 실제로 창을 생성합니다. 메인 루프에서는 발생하지 않습니다.

크기가 처음으로 1 인 이유는 처음으로 self.print_size을 호출 할 때 루트 창이 존재하지 않기 때문에 기본값 인 1을 제공하기 때문입니다. 다음에 다시 한 번 호출 할 때 창은 산란을 마쳤으므로 실제 크기를 제공합니다. 본질적으로 경쟁 조건입니다. self.root가 생성되기 전에 메인 이벤트 루프가 print self.root.winfo_width()에 도착합니다. 명령은 (루트 창이 경우) 지정된 위젯 때까지 일시 정지 메인 이벤트 루프를 강제로

self.root.wait_visibility(self.root) 

을 가지고 : 당신이 바로 self.root = Tk() 후이 줄을 추가,이 동작을 변경하려면

산란되어 보입니다.

캔버스의 크기를 300 픽셀로 설정했기 때문에 컨테이너 창에는 자연스럽게 약간의 너비가 있습니다.

+0

루트 윈도우가 아직 존재하지 않는 이유는 무엇입니까? 나는 그것을 호출하고 사용하고 있습니다. – EasilyBaffled

+0

추가 설명 추가 - 명확하게 설명합니까? 나는 또한 당신이 알아 차린 행동을 바꾸고 싶다면 고쳐주었습니다. – Brionius

+0

대단히 감사합니다. – EasilyBaffled

관련 문제