0

TkDocs Webサイトは優れたリソースですが、完全ではありません。マンページは完成していますが、もちろん Python バインディングについてのドキュメントはありません。「Tkinter で画面サイズを取得する方法は?」 は、ウィンドウ サイズは root.winfo_screenwidth() / root.winfo_screenheight() を使用して取得できることを指摘していますが、グリッド内の個々のセルではなく、ウィンドウ全体のみを対象としています。

例として TkDocs コードを使用すると、ボタンが非表示にならないように最小サイズを設定できるように、たとえば 3 行目の高さを見つけるにはどうすればよいですか? bbox() または grid_bbox() を使用して試したことはありませんが、(0,0,0,0) 以外の値を返します。実際のサイズを返すための適切な構文は何ですか?

- - - 編集 - - -

このコードは、イベント ループから呼び出されたルーチン内で bbox() がどのように使用され、正しい値を返すかを示しています。

from tkinter import *
from tkinter import ttk

# bbox() works after window has been rendered
def e_config(event):
    w, h = event.width, event.height
    print("Resize: content", w, "x", h)
    print("content bbox=", content.bbox())

def OK():
    print("OK: winfo, bbox:")
    print("    root: ", root.winfo_width(), root.winfo_height(), root.bbox())
    print(" content: ", content.winfo_width(), content.winfo_height(), content.bbox())
    print("   frame: ", frame.winfo_width(), frame.winfo_height(), frame.bbox())

root = Tk()

content = ttk.Frame(root, padding=(5,5,12,12))
content.bind("<Configure>", e_config)

frame = ttk.Frame(content, borderwidth=5, relief="sunken", width=200, height=100)
namelbl = ttk.Label(content, text="Name")
name = ttk.Entry(content)

onevar = BooleanVar()
twovar = BooleanVar()
onevar.set(True)
twovar.set(False)

one = ttk.Checkbutton(content, text="One", variable=onevar, onvalue=True)
two = ttk.Checkbutton(content, text="Two", variable=twovar, onvalue=True)
ok = ttk.Button(content, text="Okay", command=OK)
cancel = ttk.Button(content, text="Cancel")

content.grid(column=0, row=0, sticky=(E, W))    # Don't resize vertically
frame.grid(column=0, row=0, columnspan=3, rowspan=2)
namelbl.grid(column=3, row=0, columnspan=2)
name.grid(column=3, row=1, columnspan=2)
one.grid(column=0, row=3)
two.grid(column=1, row=3)
ok.grid(column=3, row=3)
cancel.grid(column=4, row=3)

root.configure(bg="#234")
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
content.columnconfigure(0, weight=1)
content.columnconfigure(1, weight=1)
content.columnconfigure(2, weight=1)
content.columnconfigure(3, weight=1)

# This doesn't work - screen hasn't been rendered yet
print("pre-init bbox ", content.bbox())

root.mainloop()
4

1 に答える 1

2

メソッドwinfo_widthwinfo_heightは、特定のウィジェットの実際のサイズを示します。

これらのメソッドも、もbbox、ウィジェットが実際に画面にレンダリングされるまで、何も役に立たないことに注意してください。それらを使用する必要がある場合は、イベントループが表示を更新する機会があったことを確認する必要があります。

また、このメソッドは、ウィジェット自体の境界ではなく、ウィジェットbboxのスレーブウィジェットの境界ボックスを返すことに注意してください。これが、frame.grid_bbox()の結果がすべてゼロを返す理由です。内部には何もないため、境界ボックスは0,0,0,0です。ただし、表示がレンダリングされると、数値が表示されます。たとえば、私のボックスでは、(0、0、352、125)を取得しますcontent.box()

于 2012-08-22T13:09:44.883 に答える