2013-07-19 2 views
1

tkinter 창에 표시된 이미지의 크기를 동적으로 조정하는 함수를 작성하려고합니다. 그러므로 나는 구성 이벤트에이 기능을 바인딩 :tkinter의 Configure 이벤트 연속 호출

connroot.bind("<Configure>", connresiz)

내 문제가 connresiz() 함수가 호출되는 것을

1) 3 배 (이유는 프로그램 시작시 3), 및

?

2) 마우스를 드래그 할 때 창을 동적으로 크기 조정하면 함수가 계속 호출됩니다. 어떻게 이것을 피할 수 있습니까?

은 내가 <Configure><ButtonRelease-1> 이벤트의 동시 존재에 체크 생각,하지만 난 공식 TK 문서, <Configure> 이벤트 화재 "때마다 그 크기, 위치, 또는 테두리에 따르면 그것을

답변

1

을 코딩하는 방법을 잘 모릅니다 너비 변화, 때로는 겹침 순서에서 위치가 바뀌 었습니다. " 이것은 시작하는 동안 여러 번 발생할 수 있습니다.

위젯의 크기가 변경되어 있기 때문에 창 크기를 조정하는 동안 계속 호출됩니다. 이것이 바로 정의 된 것입니다. 콜백에서 수행하는 작업을 확실히 수정할 수는 있지만 호출되는 것을 막을 수는 없습니다. 예를 들어 두 번째 또는 두 번째로 다른 <Configure> 이벤트를받지 못할 때까지 이미지의 크기를 조정할 수 있습니다. 이는 사용자가 대화 형 크기 조정을 중단했다는 것을 의미합니다.

+0

브라이언, 피터, 감사 : 당신은 크기를 조정할 이미지를 원하는 경우

그래서 마우스가 출시와 때 창문이 당신이 필요로하는 코드입니다 변경되었습니다. 다른 플랫폼에서 작동하는 프로그램이 필요하기 때문에 Bryan의 제안을 따랐습니다. 창 크기의 변경, "_after"명령 및 두 개 이상의 호출 이후를 방지하는 플래그를 사용하여 작동했습니다. – alessandro

1

1) 우리는 당신의 코드를 볼 수 없기 때문에 우리는 알고하지 않습니다 ...

2) 짧은 대답은 : 당신이 할 수없는, 즉 <Configure> 이벤트가 않습니다 정확히 무엇 때문에 ! 오랫동안 해답을 얻을 수 있습니다. 약간의 트릭/해킹으로 할 수 있습니다. 윈도우가 언제든지 바뀌고 있기 때문에 바인드 된 모든 함수를 <Configure>으로 호출 할 것이고, 마우스 버튼을 놓은 시점 (마지막으로 <Configure> 호출 직후)에 언제든지 같은 일이 일어납니다. 우리가 플래그/스위치를 만들 수 있습니다. "구성"되었다면 마우스 단추를 놓을 때마다 스위치를 점검하고 일부 작업을 실행 한 후에 다시 스위치를 기본값으로 전환 할 수 있습니다. 당신의 도움을

from tkinter import * 

class Run: 
    def __init__(self): 
     self.root = Tk() 
     self.clicked = False 
     self.root.bind('<ButtonRelease-1>', self.image_resize) 
     self.root.bind('<Configure>', lambda e: self.click(True)) 
    def image_resize(self, event): 
     if self.clicked: 
      print("I'm printed after <Configure>.") # the action goes here! 
      self.click(False) 
    def click(self, value): 
     self.clicked = value 

app = Run() 
app.root.mainloop() 
+1

창이 나타나면 항상 (또는 항상) ''이벤트가 발생하지 않을 수도 있습니다 창 테두리를 통해 크기가 조정됩니다. 이는 버튼 누름이 tkinter 창 외부에서 시작되기 때문입니다. 나는 이것이 다소 플랫폼과 윈도우 매니저에 의존한다고 생각한다. –

+0

아, 몰랐습니다. OS X에서 기대했던대로 작동하고 있습니다. 어쨌든 resize-watcher를 대신 추가 할 수 있습니다 : 창 너비 높이 가져 오기, 저장 후 'after' 콜백 이 변경 사항을 감시하는 추가 할 수 있습니다 - 그리고 이것은 마우스 릴리스를 대체 할 수 있습니다. 그러나 그것은 끔찍한 해킹입니다 : P –