Tkinter GUIプログラミング レイアウトマネージャpack

 今日も見に来てくださって、ありががとうございます。石川さんです。

 Tkinterのレイアウトマネージャは三種類あるのですけど、その中のpackがちょっとだけよくわからなかったので、いろいろと動作確認をしてみましたのでまとめます。お役に立てればうれしいです。

 packというくらいなので、箱詰めするんだよねぇ、というところまではイメージ通りなのですけど、箱詰めの方法がよくわからんなぁ、ということで、packのソースファイルまでさかのぼって確認してみました。コメントには、以下のようになってました。

Pack a widget in the parent widget. Use as options:
after=widget - pack it after you have packed widget
anchor=NSEW (or subset) - position widget according to given direction
before=widget - pack it before you will pack widget
expand=bool - expand widget if parent size grows
fill=NONE or X or Y or BOTH - fill widget if widget grows
in=master - use master to contain this widget
in_=master - see 'in' option description
ipadx=amount - add internal padding in x direction
ipady=amount - add internal padding in y direction
padx=amount - add padding in x direction
pady=amount - add padding in y direction
side=TOP or BOTTOM or LEFT or RIGHT -  where to add this widget.

 このsideパラメータで位置を決めていますので、組み合わせでどうなるか、ちょっとやってみました。

ソースコード

 ソースコードは以下の通りです。

import tkinter as tk
import itertools as it

SIDES = [tk.TOP,tk.BOTTOM,tk.LEFT,tk.RIGHT]
COLORS = ["red","green","blue","yellow","gray"]

class Test(tk.Toplevel):
    def __init__(self, master, i, sides):
        super().__init__(master)
        self.title(str(i))
        self.geometry("140x120")
        for i, l in enumerate(sides):
            label = tk.Label(self,text=l, bg=COLORS[i])
            label.pack(side=l)
        
class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Pack test")

        for i, s in enumerate(it.combinations_with_replacement(SIDES,len(COLORS))):
            print(i,s)
            t = Test(self, i, s)
            t.geometry("+"+str(10 + (i%10)*140)+"+"+str(10 + (i//10)*130))

        self.geometry("300x30+900+700")
        
if __name__ == "__main__":
    app = App()
    app.mainloop()

実行結果

 上のソースコードの実行結果です。

実行結果

解説

 どこへウィジェットを加えるかを決めるパラメータの、sideですが、TOPBOTTOMLEFTRIGHTの四種類の位置をセットすることができます。この組み合わせでどうなるか確認したかったので、itertoolscombinations_with_replacementを使って組み合わせを実現することにしました。このcombinations_with_replacementは、指定された長さのタプル列を重複ありのソートされた順で戻してくれます。

 このスクリプトでは、クラスを二つ定義しています。一つは、Tkを継承した本体のクラスで、もう一つは新たなウィンドウを作成するためのToplevelを継承したTestクラスです。このTestクラスでsideをいろいろと設定してみて試してみました。

 順番は、赤、緑、青、黄色、グレーの順で追加されています。afterbeforeを指定すれば順番が入れ替わるようですが、今回は追加した順番になっています。面白いな、と、思ったのは、RIGHTBOTTOMを指定した順番が右から順番、下から順番という風になっているところです。何となく、上から順番、左から順番と思っていたので、おやっ、と、思いました。

まとめ

 要素が多くないときや、単純な並びの時は、packが便利に使えそうですね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。