2017-04-11 4 views
0

私の目的は、起動時にプロンプ​​トを表示し、入力された整数に基づいて、多くのキャンバスをフレームに収めることです。フレームの高さは固定されていなければなりません(キャンバスも同様です)が、ウィンドウのサイズに応じて幅が変わり、キャンバスに均等に分配されます。pack()で動作しないキャンバスの幅のサイズを変更する

これは4つまでのキャンバスでうまく動作します。その後、キャンバスは最大ウィンドウに収まらなくなります。

さらに、キャンバスの高さがフレームの高さよりも低いため、キャンバスの上下に20ピクセルの空白の灰色のフレームが表示されないのはなぜですか?

from tkinter import * 
from tkinter import simpledialog 

b=[] 
root = Tk() 
no_of_players=simpledialog.askinteger(prompt="Enter here", title="No of participants") 

status_frame=Frame(root, bg='gray', height=100) 
status_frame.pack(fill=X) 
for i in range(no_of_players): 
    c=Canvas(status_frame, bg="orange") 
    b.append(c) 
    b[i].pack(side=LEFT,fill=X, expand=True) 
root.mainloop() 

EDIT

from tkinter import * 
from tkinter import simpledialog 

b=[] 
root = Tk() 
no_of_players=simpledialog.askinteger(prompt="Enter here", title="No of participants") 

status_frame=Frame(root, bg='gray', height=500) 
status_frame.pack(fill=X) 
for i in range(no_of_players): 
    c=Canvas(status_frame, width=1, height=100, bg="orange") 
    b.append(c) 
    b[i].pack(side=LEFT,fill=X, expand=True) 
root.mainloop() 
+0

私はあなたの質問を理解していません。あなたはキャンバスの幅を決して設定しないので、何か(デフォルトでは私のマシン上では378ピクセル)になります。それがやっていないとあなたは何を期待していますか? – Novel

+0

@ジョナサンここで2番目の[asnwer](http://stackoverflow.com/questions/22835289/how-to-get-tkinter-canvas-to-dynamically-resize-to-window-width)で提案されているようなものです。私は基本的に、キャンバスの数をX方向、つまりキャンバスの数に基づいてフレームを完全に埋めることを望むので、ウィンドウのサイズを変更しても利用可能なフレーム幅を分割する必要があります。 –

+1

'status_frame'に一時的に色を付けて、そのエッジがどこにあるかを確認することをお勧めします。私の推測は、彼らはあなたがどこにいると思うかではないということです。 –

答えて

2

キャンバスは、彼らがしようとするデフォルトのサイズを持っています。ウィンドウとフレームはすべての子を収容するために拡大または縮小しようとするため、デフォルト幅にキャンバス数がウィンドウサイズを超えるとメインウィンドウが大きくなります。

解決策は非常に簡単です。キャンバスに最小幅を与え、次にメインウィンドウに好ましいサイズを与え、キャンバスを拡大して領域を埋めるようにします。例えば

... 
root.geometry("400x100") 
... 
for i in range(no_of_players): 
    c=Canvas(..., width=1) 
    ... 
... 

あなたが上や下の空間が表示されない理由については、packのデフォルトはside='top'あるためですので、スペースの上部に固執しようとするだろう、それ。中に置かれている

あなたは上記と下の空間にしたい場合は、例えば、padyを使用します。

status_frame.pack(fill=x, pady=20) 
+0

これは最初の問題を完全に解決します。第二に:しかし、私は 'side = LEFT'を指定しました。さらに、それがトップであったとしても、キャンバスの高さが設定したフレームの高さよりも低い場合、デフォルトで空白があってはいけませんか? –

+0

@SatwikPasani:はい、あなたはキャンバスに 'side = LEFT'を指定しました。あなたは何をしているのか分かりません。 'side = LEFT'はこの特定の場合にあなたがすべきことです。キャンバスの高さがウィンドウの高さより低い場合は、下に空白がありますが、上には表示されません。再度、 "TOP"を指定したので、一番上に置かれます。 –

+0

私は明確でない場合は申し訳ありません。フレームの高さを例えば500に設定し、キャンバスの高さを150に設定した場合、キャンバスをパッキングしているときに、side = LEFTで、空のフレームが残っているはずです。私はそれを見ることができません。問題を明確にするために何か他のものを掲示すべきですか?問題のEDIT。 –

関連する問題