1

私は tkinter キャンバスを作成しています。ユーザーがいつウィンドウのサイズを変更したかを確認する必要があります。問題は、最初はウィンドウが本来あるべきサイズではないことです。私は次のものを持っています:

def print_size(self):
    print self.root.winfo_width()

def init_simulation(self, size=300):
    self.root = Tk()
    canvas = Canvas(self.root, width=size, height=size)
    self.print_size()
    self.root.after(1000, self.print_size)

これを実行すると、次のようになります。

1

そして1秒後:

306

tkinter が 6 ピクセルを追加するという事実を無視すると、サイズが最初に 1 になり、次に 306 になるのはなぜですか? 私はそれを間違って設定していますか?

4

1 に答える 1

2

でルート ウィジェットをインスタンス化するとTk()、Tkinter は別のスレッドでプロセスを開始して、実際にウィンドウを作成します。メイン ループでは発生しません。

最初にサイズの を取得する理由1は、最初に呼び出したときにルート ウィンドウがまだ存在しないself.print_sizeためです。したがって、デフォルト値は1です。1 秒後に次に呼び出すと、ウィンドウの生成が終了しているため、実際のサイズが表示されます。これは本質的に競合状態です。メイン イベント ループは、print self.root.winfo_width()self.root の作成が完了する前に到達します。

この動作を変更したい場合は、次の行を の直後に追加しますself.root = Tk()

self.root.wait_visibility(self.root)

このコマンドは、指定されたウィジェット (この場合はルート ウィンドウ) が生成されて表示されるまで、メイン イベント ループを強制的に一時停止します。

また、キャンバスのサイズを 300 ピクセルに設定しているため、コンテナ ウィンドウの幅は当然余分になります。

于 2013-08-18T22:35:35.800 に答える