2017-07-08 15 views
0

私のルーチンは、tkinterのウィンドウにボタンを追加します。ある時点で、ウィンドウは実際の画面よりも大きくなり(高さが)、私はもはや底面のボタンにアクセスできません。python 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

変数が非常に多いので、ウィジェットが適合するかどうかは分かりません。たとえば、埋め込み、余白、画面上の他のウィジェットなど

あなたは自分のアプリケーションを知っているので、そのことを説明することができます。欠けているのは、ボタンの高さを知ることだけです。ボタンで要求された高さと幅を返すwinfo_reqheightwinfo_reqwidthメソッドでtkinterから取得できます。そして、それは数学の問題です。

+0

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

+0

reqheightはクールな方法です。実際の高さを得るために私のウィジェットで 'update()'を使いましたが、時間がかかり、リアルタイムでボタンがポップアップして見えるようになりました(これは醜いです)。 私は、ルートサイズと画面サイズをどのように比較できるか尋ねていました。私は 'root.winfo_height()'を実行しましたが、実際にはreqheightを使うこともできます: 'root.winfo_reqheight> root.winfo_screenheight():#...' – offeltoffel

+0

@PRMoureu:同じように。あなたのソリューションは、ルート内のすべての私のウィジェットの高さを合計しますか? – offeltoffel

関連する問題