4

tkinter ウィンドウに表示される画像のサイズを動的に変更する関数を作成しようとしています。Configureしたがって、この関数をイベントにバインドしました。

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

私の問題は次のとおりです。

  1. connresiz()関数がプログラムの開始時に 3 回 (なぜ 3 回?) 呼び出されるか、および

  2. さらに厄介なことに、ウィンドウのサイズを動的に変更すると、マウスをドラッグすると関数が継続的に呼び出されます。どうすればこれを回避できますか?

<Configure>aとイベントの同時存在をチェックしようと思ったのです<ButtonRelease-1>が、コーディングの仕方がわかりません。

4

2 に答える 2

4

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()
于 2013-07-19T15:42:52.400 に答える
2

公式の tk ドキュメントによると、<Configure>イベントは「サイズ、位置、または境界線の幅が変更されるたびに、また場合によっては重ね順での位置が変更されたときに」発生します。これは、起動中に数回発生する可能性があります。

ウィジェットのサイズが変化しているため、ウィンドウのサイズを変更している間、継続的に呼び出されます。それが、実行するように定義されていることです。コールバックで行う内容を変更することはできますが、呼び出されるのを防ぐことはできません。たとえば、別の<Configure>イベントを 1 ~ 2 秒間受信しないまで、画像のサイズ変更を遅らせることができます。これは、ユーザーがインタラクティブなサイズ変更を停止したことを意味する可能性があります。

于 2013-07-19T15:26:45.663 に答える