私は、ウィンドウのサイズに応じて、tkinterキャンバス上のオブジェクトの位置を変更するプログラムを持っています。これは動作しますが、ループごとに実行され、多くのオブジェクトがある場合は、削除して再描画するので、プログラムが劇的に遅くなります。Python Tkウィンドウの変更をチェックする方法はありますか?
ウィンドウのサイズの変更をチェックする方法はありますか?そのため、必要なときに1回だけ実行する必要があります。
私は、ウィンドウのサイズに応じて、tkinterキャンバス上のオブジェクトの位置を変更するプログラムを持っています。これは動作しますが、ループごとに実行され、多くのオブジェクトがある場合は、削除して再描画するので、プログラムが劇的に遅くなります。Python Tkウィンドウの変更をチェックする方法はありますか?
ウィンドウのサイズの変更をチェックする方法はありますか?そのため、必要なときに1回だけ実行する必要があります。
ウィンドウサイズが変更されると(その他の理由で)、tkinterは<Configure>
イベントを発生させます。このイベントにバインドして、ウィジェットのサイズが変更されたときに通知を受け取ることができます。公式ドキュメントから
:
A設定のイベントがウィンドウに送信されるたびにその大きさ、位置、または境界線の幅が変化し、時にはそれが重なり順で位置を変更したとき。
注:これは、ルートウィンドウだけでなく、すべてのウィジェットに当てはまります。たとえば、キャンバスウィジェットまたは他のウィジェットにバインドすることができます。
例:
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, width=20)
label.pack(side="top", fill="both", expand=True, padx=20, pady=20)
def handle_configure(event):
text="window geometry:\n" + root.geometry()
label.configure(text=text)
root.bind("<Configure>", handle_configure)
root.mainloop()
あなたがバインドされた機能の中から、ウィジェットのサイズを変更するか、ウィジェットのサイズが変更されるイベントがトリガされるように、あなたが無限ループに終わる可能性がないように注意する必要があり、ウィジェットのサイズを変更すると、イベントがトリガーされます。
実際には、ピクセル単位でw
の現在の高さと幅を取得するw.winfo_height()
w.winfo_width()
方法を使用することができる。(w
は、任意のタイプの任意のウィジェットであってもよい。)
例えば
from Tkinter import *
w=Tk()
w.geometry('400x600')
w.update()
print (w.winfo_width())
print (w.winfo_height())