چیدمان عناصر

چیدمان عناصر (layout manager)، نحوه چینش عناصر را بر روی فرم یا والدشان، مشخص می‌کند. همه عناصر tkinter به توابع خاصی، برای مشخص کردن نحوه چیدمان عنصر، دسترسی دارند. هدف این توابع مرتب کردن عناصر بر روی عنصر والد (دربرگیرنده‌شان) است. tkinter سه تابع زیر را برای این منظور ارائه می‌دهد:

  • ()pack
  • ()grid
  • ()place

اکنون به صورت مختصر به بررسی این توابع می‌پردازیم.

()pack

این تابع، عناصر را قبل از قرار گرفتن بر روی فرم والدشان، درون بلوک‌هایی قرار می‌دهد :

widget.pack( pack_options )

pack_options، تنظیماتی هستند که نوع رفتار یا چینش عنصر را مشخص می‌کنند. در داخل پرانتز تابع ()pack می‌توان از تنظیمات زیر استفاده کرد:

  • expand : اگر مقدار این گزینه را برابر 1 یا true قرار دهید و اندازه والد از اندازه فرزندش بزرگتر باشد، آن اندازه یا فضای اضافی، برای عنصر فرزند در نظر گرفته می‌شود ولی این بدین معنا نیست که عنصر فرزند همه آن فضا را اشغال می‌کند:
    layout-manager-tkinter-01
    در شکل بالا ما سه عنصر به فرم اضافه کرده‌ایم و خاصیت expand عنصر وسطی را برابر 1 قرار داده‌ایم. همانطور که مشاهده می‌کنید، اگر اندازه فرم بزرگتر از اندازه عناصر باشد، آن فضا یا اندازه اضافی به عنصری که خاصیت expand برابر 1 باشد، تعلق گرفته و بقیه عناصر قبل و بعد از این فضا قرار می‌گیرند. چون ما در مورد اضافه کردن عناصر هنوز صحبت نکرده‌ایم به کد زیر برای چگونگی تنطیم این خاصیت بسنده می‌کنیم:

    widget.pack(expand=1)

    همانطور که در کد بالا مشاهده می‌کنید، کافیست در داخل پرانتز expand=1 را بنویسید تا رفتار عنصر را مسخص کنید.

  • fill : با تنظیم این گزینه، عنصر فضایی را که در اختیارش قرار داده شده اشغال می‌کند. می‌توان با استفاده از مقادیر X ،Y ،NONE و BOTH نحوه پر کردن فضا را مشخص کنیم:
    layout-manager-tkinter-02
    مقادیر X و Y به ترتیب باعث می‌شوند که عنصر در راستای افقی و عمودی و مقدار BOTH باعث می ود که عنصر در هر دو راستای افقی و عمودی فضا را اشغال کند. به یک نکته در همین جا اشاره کنیم و آن این است که مقادیر Y و BOTH در صورتی اثر خود را نشان می‌دهند که همراه با گزینه expand = 1 به کار بروند. مثلاً ما برای ایجاد ساختاری مانند شکل بالا، کدی شبیه به کد زیر نوشته‌ایم :

    widget.pack(fill=NONE)
    widget.pack(fill=X)
    widget.pack(fill=Y   , expand=1)
    widget.pack(fill=BOTH, expand=1)
    
  • side : این گزینه، مقادیر RIGHT ,LEFT ،TOP ،BOTTOM را دریافت کرده و مشخص می‌کند که چیدمان عناصر ابتدا از کدام قسمت والد، شروع شود. به شکل زیر توجه کنید:
    layout-manager-tkinter-03
    برای ایجاد همچنین چیدمانی، ما کدهایی به صورت زیر نوشته‌ایم:

    widget.pack(side=TOP)
    widget.pack(side=LEFT)
    widget.pack(side=RIGHT)
    widget.pack(side=BOTTOM)
    

    ممکن است این سؤال برایتان پیش بیاید که اگر دو عنصر دارای با مقادیر side یکسان چه اتفاقی می افتد؟ در این صورت، اگر عناصر دارای مقدار LEFT یا RIGHT باشند به ترتیب در کنار هم و اگر دارای مقادیر TOP و BOTTOM باشند روی هم قرار می‌گیرند.

()grid

این تابع، عناصر را در ساختارهایی شبیه به جدول، بر روی فرم والد، مرتب می‌کند:

widget.grid( pack_options )

pack_options، تنظیماتی هستند که نوع رفتار یا چینش عنصر را مشخص می‌کنند. در داخل پرانتز تابع ()grid می‌توان از تنظیمات زیر استفاده کرد:

خاصیت توضیح
column مشخص می‌کند که فرم به چند ستون برای قرار گرفتن عناصر تقسیم شود.
row مشخص می‌کند که فرم به چند سطر برای قرار گرفتن عناصر تقسیم شود.
padx فاصله بین عناصر در محور افقی را مشخص می‌کند.
pady فاصله بین عناصر در محور عمودی را مشخص می‌کند.
ipadx فاصله بین سلول و عنصری که در داخل سلول قرار دارد، در محور افقی را مشخص می‌کند.
ipady فاصله بین سلول و عنصری که در داخل سلول قرار دارد، در محور عمودی را مشخص می‌کند.
sticky اگر اندازه سلول از اندازه عنصری که در داخل آن قرار گرفته است، بزرگ‌تر باشد، این خاصیت مشخص می‌کند که عنصر در چه جای سلول قرار بگیرد: شمال، شمال غربی و … . مقادیری هم که این خاصیت دریافت می‌کند عبارتند از : N ،E ،S ،W ،NE ،NW ،SE ،SW و center

layout-manager-tkinter-04

()place

این تابع، عناصر را در موقعیت مشخصی، بر روی فرم والد، قرار می‌دهد:

widget.place( pack_options )

pack_options، تنظیماتی هستند که نوع رفتار یا چینش عنصر را مشخص می‌کنند. در داخل پرانتز تابع ()grid می‌توان از تنظیمات زیر استفاده کرد:

خاصیت توضیح
anchor این خاصیت مشخص می‌کند که عنصر در چه جای عنصر والدش قرار بگیرد: شمال، شمال غربی و … . مقادیری هم که این خاصیت دریافت می‌کند عبارتند از : N ،E ،S ،W ،NE ،NW ،SE ،SW و center
bordermode مکان قرار گیری یک عنصر را با و بدون در نظر گرفتن ضخامت حاشیه والدش مشخص می‌کند. این خاصیت دو مقدار outside و inside را دریافت می‌کند.
height, width عرض و ارتفاع عنصر را مشخص می‌کند.
relheight, relwidth عددی بین 0.0 و 1.0 است و طول و عرض عنصر را با توجه به طول و عرض عنصر والدش تغییر می‌دهد.
relx, rely عددی بین 0.0 و 1.0 است و مکان قرارگیری گوشه بالا و سمت چپ یک عنصر را با توجه به گوشه بالا سمت و سمت چپ والدش مشخص می‌کند.
x, y مکان قرارگیری گوشه بالا و سمت چپ یک عنصر را با توجه به گوشه بالا سمت و سمت چپ والدش، بر اساس محورهای افقی و عمودی و با یک عدد صحیح، مشخص می‌کند.

bordermode
layout-manager-tkinter-05

relheight, relwidth
مقداردهی این دو خاصیت، مثلاً relwidth=1.0، یعنی اینکه عنصر ما، با کم و زیاد شدن عرض والدش، همواره تمام عرض آن را بپوشاند. به دو شکل زیر توجه کنید:
layout-manager-tkinter-06
وقتی فرم را بزرگ کنیم، عنصر ما یعنی Widget همواره تمام عرض والد خود را پوشش می‌دهد:
layout-manager-tkinter-07

relx, rely
با مقداردهی این دو خاصیت، همواره تناسب رعایت می‌شود. یعنی اگر شما اندازه فرم را کوچک و بزرگ کنید، عنصر هم بر اساس مقداری که به این دو خاصیت داده‌اید تغییر مکان می‌دهد. مثلاً اگر مقادیر این دو خاصیت relx=0.5 و rely=0.5 باشد، با بزرگ و کوچک شدن فرم، گوشه بالا و سمت چپ عنثر همواره در وسط فرم قرار می‌گیرد. به دو شکل زیر توجه کنید:
layout-manager-tkinter-08

layout-manager-tkinter-09

x, y
با مقداردهی این دو خاصیت، اگر شما اندازه فرم را کوچک و بزرگ کنید، عنصر تغییر مکان نمی‌دهد. مثلاً اگر مقادیر این دو خاصیت y=50 و x=50 باشد، عنصر 50 پیکسل به سمت راست و 50 پیکسل به سمت پایین می‌آید و با بزرگ و کوچک شدن فرم، این مکان را حفظ می‌کند. به دو شکل زیر توجه کنید:
layout-manager-tkinter-10

layout-manager-tkinter-11