2012-08-22 71 views
0

TkDocs網站是一個很好的資源,但它不完整。 manpage已完成,但當然不會記錄Python綁定。 「How to get the screen size in Tkinter?」指出可以使用root.winfo_screenwidth()/ root.winfo_screenheight()來獲得窗口大小,但只處理整個窗口,而不是網格中的單個單元格。使用網格佈局管理器發現元素大小?

以TkDocs代碼爲例,我如何找到例如第三行的高度,以便我可以設置防止按鈕被隱藏的最小尺寸?沒有我試過使用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() 

回答

1

的方法winfo_widthwinfo_height會給你一個給定的組件的實際大小。

請注意,這些方法和bbox都不會給您任何有用的信息,直到窗口小部件實際呈現在屏幕上。如果您需要使用它們,您需要確保事件循環有機會更新顯示。

此外,要知道的是,bbox方法返回奴隸的邊框部件小部件,而不是小工具本身的邊界。這就是爲什麼frame.grid_bbox()的結果返回全零的原因 - 它裏面沒有任何東西,所以邊界框是0,0,0,0。但是,一旦顯示器已被渲染,您應該看到content.box()的編號。在我的盒子上,例如,我得到(0,0,352,125)

+0

感謝 - 我的真實應用程序具有基於定時器的更新,並且bbox()在初始化期間和事件循環運行後都返回零。我會給玩具代碼添加一個調整大小的回調函數,因爲我仍然想知道bbox()應該如何工作。 – Dave

+0

@Dave:你是否確定bbox在所有情況下都返回全零?一旦顯示更新後,我發現它會爲'content.bbox()'返回有效的數字。我已經更新了我的答案,以解釋爲什麼'frame.grid_bbox()'總是返回(0,0,0,0)。 –

+0

我很驚訝地看到調整大小的回調函數返回玩具代碼的正確大小。令人不好意思的是,我在應用程序中將bbox添加到重置按鈕回調中,但我也稱該例程在屏幕呈現之前進行設置。感謝您的幫助 - 如果其他人可以從我的粗心大意中受益,我不會刪除該問題。 – Dave

相關問題