2017-07-08 43 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