30

私の理解では、メソッド内のすべてのフレームとウィジェットを初期化した後、__init__これらすべてのコンポーネントに合わせて tkinter ウィンドウのサイズが変更されます。

ウィンドウの初期化されたサイズを最小サイズに設定したいと思います。ウィンドウを最大化して拡大できるようにしたいのですが、ウィジェットを隠し始めるほどウィンドウを小さくしたくありません。

どうすればこれを達成できますか?

4

4 に答える 4

53

次のようなものを使用して、メインループに入らずにすぐに更新を強制することもできます。

root = Tk()
# set up widgets here, do your grid/pack/place
# root.geometry() will return '1x1+0+0' here
root.update()
# now root.geometry() returns valid size/placement
root.minsize(root.winfo_width(), root.winfo_height())

effbot tkinterbookでのupdate()の説明:

保留中のすべてのイベントを処理し、イベント コールバックを呼び出し、保留中のジオメトリ管理を完了し、必要に応じてウィジェットを再描画し、保留中のすべてのアイドル タスクを呼び出します。このメソッドは注意して使用する必要があります。間違った場所 (たとえば、イベント コールバック内から、または何らかの方法でイベント コールバックから呼び出すことができる関数など) から呼び出されると、非常に厄介な競合状態が発生する可能性があるためです。 .)。疑わしい場合は、代わりに update_idletasks を使用してください。

メインループにジャンプする前に、ウィジェットのサイズ/位置を取得するなどの方法を理解しようとしているときに、これをかなり使用しました。

于 2012-05-04T15:49:47.133 に答える
26

この質問は古いことは知っていますが、別の方法があります:

root = Tk()
root.minsize(foo, bar)

root.minsize()は、ウィンドウの最小サイズをfoobarに設定します。ここで、foobarはそれぞれウィンドウの幅と高さです。

ただし、メインループの実行が完了する前に、このコードを実行する必要があります。コマンドが呼び出された後にのみ有効になります。

于 2015-10-21T22:08:16.507 に答える
4

私はそれを考え出した:

def __init__(self, master):
    ...
    self.master.update_idletasks()
    self.master.after_idle(lambda: self.master.minsize(self.master.winfo_width(), self.master.winfo_height()))
于 2012-05-04T14:11:48.320 に答える
-6
root = Tk()

ルートウィンドウが作成されるため。ルート ウィンドウは、プログラムのメイン アプリケーション ウィンドウです。タイトルバーとボーダーがあります。これらは、ウィンドウ マネージャによって提供されます。他のウィジェットより前に作成する必要があります。

root.geometry("250x150+300+300")

geometry()メソッドは、ウィンドウのサイズを設定し、画面上に配置します。最初の 2 つのパラメーターは、ウィンドウの幅と高さです。最後の 2 つのパラメーターは、x、y スクリーン座標です。

app = Example(root)

ここでは、アプリケーション クラスのインスタンスを作成します。

root.mainloop()  

最後に、メインループに入ります。イベント処理はこの時点から開始されます。メインループは、ウィンドウ システムからイベントを受け取り、それらをアプリケーション ウィジェットにディスパッチします。タイトルバーの閉じるボタンをクリックするか、quit() メソッドを呼び出すと終了します。

ここに画像の説明を入力

これがお役に立てば幸いです。

于 2014-08-25T12:06:38.767 に答える