どのように私はそれが冗長と呼ばれる複数回を得ることなくTkinterのリサイズイベントにコールバックをバインドすることができますか?

KBriggs:

私は、ネストされたウィジェットのかなり大きな数とTkinterのGUIを持っています。私は、ウィンドウのサイズが変更されたとき、私は、resizeイベントにコールバックをバインドしているので、その一部を再スケールします:

self.parent.bind("<Configure>", self.onsize)

ウィンドウのサイズが変更されますたびしかし、self.onsize()すべてのダウンを遅くし、最大再帰深度を超えた後にいくつかのケースでクラッシュを引き起こして、〜100回呼び出さなっています。私は、一つ一つのウィジェットが親ウィンドウのサイズを変更する過程で個別に再スケーリングにつれて、それが呼び出さなっているためであると仮定しています。

どのように私は、それが唯一の親ウィンドウの後、一度呼ばれ、内部的にリンクされたウィジェットのすべてがサイズ変更されているように、このコールバックを設定することができますか?

代わりに、どのように私は、中に含まれる情報から知ることができevent、親ウィンドウにイベント該当するか否か、または親の子供に、渡されるパラメータ?

ブライアンオークリー:

私は、一つ一つのウィジェットが親ウィンドウのサイズを変更する過程で個別に再スケーリングにつれて、それが呼び出さなっているためであると仮定しています。

多分そうでないかもしれません。それは親が何であるかに依存し、あなたがバインドされた関数の中で何をやっています。(バインドされたウィジェットの場合はself.parentあなたの例では)ルートウィンドウまたはのインスタンスであるToplevel、結合は、すべての子ウィンドウに適用されます。そうしないと、イベントは、それがバインドされているウィジェットのためにトリガします。

ほとんどの場合、あなたの関数は、イベントに応答している間、ウィジェットのサイズを変更させるために何かをやっています。これは、新しいイベントをトリガする、とあなたは再帰エラーを取得する理由です。要するに、あなたは、変更の大きさにイベントを受け取ったウィジェットを引き起こすことがバインドされた機能の中で何かをやってはいけません。

どのように私は、それが唯一の親ウィンドウの後、一度呼ばれ、内部的にリンクされたウィジェットのすべてがサイズ変更されているように、このコールバックを設定することができますか?

一つの解決策は、バインドされた機能のスケジュールにはTkinterを使用して、再描画を完了すると呼ばれる別の機能を持つことですafter_idleこれはあなたの特定のケースで動作するかどうかは、あなたの質問は、あなたが実際にやっている理由を示していないので、言い難いです。あなたの関数は、それ自体が呼び出している場合updateupdate_idletasks、それらの機能がアイドルのイベントを処理するので、それはおそらく動作しません。

代わりに、どのように私は親ウィンドウにイベント該当するか否か、または親の子供に、渡されるイベントパラメータに含まれる情報から伝えることができますか?

widgetイベントオブジェクトの属性は、イベントを受信したウィジェットを教えてくれます。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=399601&siteId=1