2017-07-08 44 views
0

我的例程將按鈕添加到tkinter中的窗口。在某些時候,窗口變得比我的實際屏幕更大(高度),我不能訪問底部的按鈕了。蟒蛇Tkinter:如何禁止一個窗口變得比屏幕尺寸更大

演示代碼:

from Tkinter import * 

n_buttons = 20 # <- change this as you wish for testing the code 

def generate_buttons(n): 

    for i in range(n): 
     button = Button(myframe, text="Button Clone", height=4) 
     button.grid(row=i) 

root = Tk() 
myframe = Frame(root) 
myframe.pack() 

generate_buttons(n=n_buttons) 

root.mainloop() 

作爲第一次嘗試,我把下面的代碼到我的循環:

if root.winfo_height() > root.winfo_screenheight(): 
    print("I'm full!") 
    break 

但是1)它不工作,2)我強烈希望一個解決方案,用於檢查該窗口是否可以在之前採用另一個按鈕,以便我不必在之後將其銷燬。

在我的真實代碼中,放置爲2D網格的按鈕以及對窗口過載的第一反應是增加幀中的列數,然後減小所有按鈕的高度。同樣,如果我必須重新生成所有按鈕,直到滿足所有要求,那將會很糟糕。如果在第一個按鈕創建之前,您可以幫助我解決問題,那麼這將非常好。謝謝!

+0

那麼,你希望你的循環在沒有按鈕空間的情況下立即退出? –

+0

@BryanOakley:這將是「最低目標」。更好:讓代碼檢查按鈕的預期數量是否會超過窗口大小,並在進入循環之前做出相應的反應(例如減小按鈕大小或打印錯誤)。 – offeltoffel

+0

滾動條是不是在你的情況下的選項? – PRMoureu

回答

1

很難知道小部件是否適合,因爲有太多變數。例如,填充,邊距,屏幕上的其他小部件等。

這就是說,既然你知道你自己的應用程序,你可以解釋它。唯一缺少的就是知道按鈕的高度。您可以從tkinter中獲得該方法,該方法返回該按鈕所請求的高度和寬度的winfo_reqheightwinfo_reqwidth方法。然後,這只是一個數學問題。

+0

'print(sum(map(lambda x:x.winfo_reqheight(),myframe.children.values())))' – PRMoureu

+0

'reqheight'是一種很酷的方法。我在我的小部件上使用'update()'來獲得它的真實高度,但這需要很長時間,並且讓用戶看到實時彈出的按鈕(這很醜陋)。 我正要問我如何比較根大小和屏幕大小。我做了'root.winfo_height()',但實際上我也可以使用reqheight: if root.winfo_reqheight> root.winfo_screenheight():#...' – offeltoffel

+0

@PRMoureu:我有按鈕放在列以及。你的解決方案總結了我的所有小部件的高度,不是嗎? – offeltoffel