2013-07-19 41 views
1

我正在嘗試編寫一個函數來動態調整在tkinter窗口中顯示的圖像的大小。 因此,我必將此功能可將配置事件:連續調用tkinter中的Configure事件

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

我的問題是

1)該connresiz()函數被調用3次(爲什麼3)在程序開始,和

2)更麻煩,​​動態調整窗口大小,我拖動鼠標不斷調用函數!如何避免這種情況?

我想過在<Configure><ButtonRelease-1>事件的同時存在檢查,但我不知道如何代碼它

回答

1

根據官方的TK文件,<Configure>事件觸發「每當其大小,位置,或邊界寬度發生變化,有時它在堆疊順序中改變了位置。「啓動過程中可能會發生多次。

因爲窗口小部件的大小在變化,所以在調整窗口大小時會連續調用它。這就是它的定義。你不能阻止它被調用,儘管你當然可以修改你在回調中做的事情。例如,您可以延遲調整圖像大小,直到您還沒有收到其他<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上,它正在按照我的預期工作。無論如何,可以添加一個調整大小的觀察者,而不是:獲取窗口的寬度高度,存儲它,並在回調之後可以添加,正在觀察變化 - 這可能會取代鼠標釋放。但這是一個可怕的黑客:P –