2014-07-26 2 views
2

일부 텍스트 줄을 표시하기 위해 (FrameLabel 통해) 위젯을 작성 중이며 문자 높이가 포함 높이 인 Frame보다 큰 경우 글꼴 크기를 조정해야합니다. 이 맞을 때까지 (더 좋은 아이디어가, 루프 -프레임의 자연 높이가 즉시 업데이트되지 않는 이유는 무엇입니까?

그렇게하기 위해, 나는 그것을 줄이고 텍스트를 재 작성에 아이디어, 업데이트 된 Label 텍스트 후 Frame에 대한 .winfo_reqheight()를 조회하고 따뜻하게 환영)

어쨌든,이 기능을 구현하기위한 테스트 스크립트를 작성했지만 Frame에 대한 높이는 Label (텍스트를 업데이트 한 후)과 비교하여 일회용입니다. 실용적인 관점에서

다음 Frame의 크기가 하나의 방법 코드

import Tkinter as tk 

class App(): 
    def __init__(self): 
     self.root = tk.Tk() 
     self.root.geometry("200x200") 
     self.f = tk.Frame(self.root) 
     self.f.pack(expand=True, fill=tk.BOTH) 
     self.l = tk.Label(self.f) 
     self.l.pack(expand=True, fill=tk.BOTH) 
     self.root.bind("q", func=self.addline) 
     self.counter = 0 

    def addline(self, event): 
     mylist = list() 
     self.counter += 1 
     for _ in range(self.counter): 
      mylist.append("hello") 
     message = '\n'.join(mylist) 
     self.l.configure(text=message, font=('Arial', 30)) 
     print("frame: {0} label {1}".format(self.f.winfo_reqheight(), self.l.winfo_reqheight())) 

App().root.mainloop() 

후 3 프레스 q의 표시

enter image description here

출력한다

frame: 21 label 51 
frame: 51 label 96 
frame: 96 label 141 

알 떨어져서? 두 위젯이 동시에 쿼리되는데도이 동작의 이유는 무엇입니까?

답변

1

이벤트 핸들러가 리턴 될 때까지 변경된 사항은 갱신되지 않습니다.

하지만 당신은 update_idletasks를 사용하여 업데이트를 강제 할 수

self.l.configure(text=message, font=('Arial', 30)) 
self.l.update_idletasks() 

enter image description here

UPDATE

winfo_height() documentationupdate_idletasks 언급 :

가 받기 이 위젯의 ​​높이 (픽셀 단위)입니다. 창 이 지오메트리 관리자에 의해 관리되지 않는 경우이 메서드는 1을 반환합니다. 을 얻으려면 update_idletasks을 먼저으로 호출해야 할 수 있습니다. 도 winfo_reqheight을 사용하여 위젯의 요청 된 높이를 가져올 수 있습니다. 즉, 은 위젯 자체가 정의한대로 " 내용을 기준으로 정의한"자연스러운 크기입니다.

+0

@PadraicCunningham, 수정 해 주셔서 감사합니다. :) – falsetru

+0

걱정 마세요, 당신은 환영합니다 :) –

관련 문제