Python之tkinter 窗口控件配置管理員之pack方法

簡介

在設計GUI程序時,可以使用三種方法包裝和定位各組件在容器窗口內的位置
這三種方法又稱窗口控件配置管理員(Widget Layout Manager)

  • pack 方法
  • grid 方法
  • place 方法

pack 方法

雖然我們稱pack方法,其實是在tkinter內這是一個類別。這是最常使用的控件配置管理方法,它是使用相對位置的概念處理Widget控件配置,至於控件的正確位置,則是由pack 方法自動完成。

pack 方法的語法格式:

pack(options, ...)

它的參數有 sidefillpadx/padyipadx/ipadyanchor

side參數

side參數可以垂直或水平配置控件

例子

import tkinter

# 創建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack()
label2.pack()
label3.pack()

root.mainloop()

運行結果:
在這裏插入圖片描述
當窗口中有多個組件時,使用pack可以讓組件由上往下排列顯示,這其實也是系統的默認設置。

使用pack方法時,也可以增加side參數設置組件的排列方式,參數如下:

  • TOP:這是默認值,由上往下排列
  • BOTTOM:由下往上排列
  • LEFT:由左往右排列
  • RIGHT:由右往左排列

例子:使用從下往上排列

label1.pack(side=tkinter.BOTTOM)
label2.pack(side=tkinter.BOTTOM)
label3.pack(side=tkinter.BOTTOM)

運行結果:
在這裏插入圖片描述
例子:從左往右排列

label1.pack(side=tkinter.LEFT)
label2.pack(side=tkinter.LEFT)
label3.pack(side=tkinter.LEFT)

運行結果:
在這裏插入圖片描述

例子:從右往左排列

label1.pack(side=tkinter.RIGHT)
label2.pack(side=tkinter.RIGHT)
label3.pack(side=tkinter.RIGHT)

運行結果:
在這裏插入圖片描述
例子:重新設計side,使之成三角狀

import tkinter

# 創建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow",
                       width=10)
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue",
                       width=10)
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen",
                       width=10)
label1.pack()
label2.pack(side=tkinter.LEFT)
label3.pack(side=tkinter.RIGHT)

root.mainloop()

運行結果:
在這裏插入圖片描述
例子:列出relief的全部屬性

import tkinter

Reliefs = ["flat", "groove", "raised", "ridge", "solid", "sunken"]
# 創建主窗口
root = tkinter.Tk()

for Relief in Reliefs:
    tkinter.Label(root, text=Relief, relief=Relief,
                  fg="blue").pack(side=tkinter.LEFT, padx=5)

root.mainloop()

運行結果:
在這裏插入圖片描述

例子:列出所有bitmaps位圖

import tkinter

bitMaps = ["error", "hourglass", "info", "questhead", "question", "warning", "gray12", "gray25", "gray50", "gray75"]
# 創建主窗口
root = tkinter.Tk()

for bitmaps in bitMaps:
    tkinter.Label(root, bitmap=bitmaps).pack(side=tkinter.LEFT, padx=5)

root.mainloop()

運行結果:
在這裏插入圖片描述

padx/pady參數

在使用pack方法時,可以使用padx/pady參數設定控件邊界與容器(可想成窗口邊界)的距離或是控件邊界間的距離。

在默認環境下,窗口控件間的距離是1像素。如果希望有適度間距,可以設置參數padx/pady,代表水平間距/垂直間距

例子:在Two上下增加10像素間距

import tkinter

# 創建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack(fill=tkinter.X)
label2.pack(pady=10)
label3.pack(fill=tkinter.X)

root.mainloop()

運行結果:
在這裏插入圖片描述
結果很明顯,就是Two(label2)上下各有10像素

例子:在One上下增加10像素間距

label1.pack(fill=tkinter.X, pady=10)
label2.pack(pady=10)
label3.pack(fill=tkinter.X)

運行結果:
在這裏插入圖片描述
OneTwo 中間是兩個10像素,所以是20像素

例子:標籤寬度爲10像素,左右邊界與容器邊界是30像素

import tkinter

# 創建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow",
                       width=10)
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue",
                       width=10)
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen",
                       width=10)
label1.pack(padx=30)
label2.pack(padx=30)
label3.pack(padx=30)

root.mainloop()

運行結果:
在這裏插入圖片描述
例子:使三個標籤橫向排列,Two 的左右邊界爲10像素

import tkinter

# 創建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow",
                       width=10)
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue",
                       width=10)
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen",
                       width=10)
label1.pack(side=tkinter.LEFT)
label2.pack(side=tkinter.LEFT, padx=10)
label3.pack(side=tkinter.LEFT)

root.mainloop()

運行結果:
在這裏插入圖片描述

ipadx/ipady參數

ipadx參數可以控制標籤文字與標籤容器的X軸間距,ipady參數可以控制標籤文字與標籤容器的Y軸間距

例子:讓Two標籤的X軸間距是20

import tkinter

# 創建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack()
label2.pack(ipadx=10)
label3.pack()

root.mainloop()

運行結果:
在這裏插入圖片描述
例子:讓Two標籤的Y軸間距是20

import tkinter

# 創建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack()
label2.pack(ipady=10)
label3.pack()

root.mainloop()

運行結果:
在這裏插入圖片描述

padx參數與ipadx參數的區別
  • padx:是指標籤的小框框窗口的距離,或者是與其他小框框的距離
  • ipadx:是指標籤內部的文字小框框的距離
anchor參數

這個參數可以設定Widget控件在窗口中的位置,但是在這裏是指控件內容在控件區域的位置設置

其實就是標籤文字在標籤區域的位置

例子:在窗口右下方建立一個內容爲“One”的標籤,其中標籤與窗口右邊和下邊的間距爲10像素

import tkinter

# 創建主窗口
root = tkinter.Tk()
root.geometry("300x200")

label1 = tkinter.Label(root, text="One",
                      bg="lightgreen", width=8, height=2)
label1.pack(anchor=tkinter.S, side=tkinter.RIGHT, padx=10, pady=10)

root.mainloop()

運行結果:
在這裏插入圖片描述
例子:在窗口正下方建立一個內容爲“One”的標籤,其中標籤與窗口右邊和下邊的間距爲10像素

import tkinter

# 創建主窗口
root = tkinter.Tk()
root.geometry("300x200")

label1 = tkinter.Label(root, text="One",
                      bg="lightgreen", width=8, height=2)
label1.pack(anchor=tkinter.S, side=tkinter.BOTTOM, padx=10, pady=10)

root.mainloop()

運行結果:
在這裏插入圖片描述

例子:增加一個標籤,使兩個標籤在右下方一次排開

import tkinter

# 創建主窗口
root = tkinter.Tk()
root.geometry("300x200")

label1 = tkinter.Label(root, text="One",
                      bg="lightgreen", width=8, height=2)
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue", width=8, height=2)
label1.pack(anchor=tkinter.S, side=tkinter.RIGHT, padx=10, pady=10)
label2.pack(anchor=tkinter.S, side=tkinter.RIGHT, pady=10)

root.mainloop()

運行結果:
在這裏插入圖片描述

fill參數

fill 參數的主要功能是告訴 pack管理程序,設置控件填滿所分配容器區間的方式

參數:

  • fill = X:表示控件可以填滿所分配空間的X軸不留白
  • fill = Y:表示控件可以填滿所分配空間的Y軸不留白
  • fill = BOTH:表示控件可以填滿所分配空間的X軸和Y軸
  • fill默認值爲NONE,表示保持原大小

例子:是第1個標籤和第3個標籤內增加fill = X 參數

import tkinter

# 創建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack(fill=tkinter.X)
label2.pack()
label3.pack(fill=tkinter.X)

root.mainloop()

運行結果:
在這裏插入圖片描述
由此可見,第一欄和第三欄已被填充滿

如果所分配容器區間已經滿了,則使用此fill參數將不會有任何作用。

fill參數在使用上能有些複雜,建議使用後續的grid方法

例子:驗證如果所分配的容器區間已經滿了,則使用此fill參數將不會有任何作用

label1.pack(fill=tkinter.X)
label2.pack(fill=tkinter.Y)
label3.pack(fill=tkinter.X)

運行結果:
在這裏插入圖片描述
一模一樣

下面我們來使用fill = BOTH使它全部填充

import tkinter

# 創建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack(fill=tkinter.BOTH, side=tkinter.LEFT)
label2.pack(fill=tkinter.Y)
label3.pack(fill=tkinter.BOTH)

root.mainloop()

運行結果:
在這裏插入圖片描述
我們發現,本來BOTH是填充X軸Y軸的,但是Three的Y軸並沒有被填充

這是爲什麼呢?當擴充窗口大小時,Three在Y軸的空間稱爲額外空間,這時需要藉助一個叫expand的參數

expand參數

expand 參數可設定Widget控件是否填額外的父容器空間

  • 默認是False(或是0),表示不填滿
  • 如果是True(或是1),表示填滿

例子

import tkinter

# 創建主窗口
root = tkinter.Tk()

label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack(fill=tkinter.BOTH, side=tkinter.LEFT)
label2.pack(fill=tkinter.X)
label3.pack(fill=tkinter.BOTH, expand=1)

root.mainloop()

運行結果:
在這裏插入圖片描述

pack 的方法

pack 其實在Python tkinter中是一個類別,他提供下列方法供我們使用

方法名稱 說明
slaves() 傳回所有Widget控件對象
info() 傳回pack選項的對應值
forget() 隱藏Widget控件,可以用pack(option,…)復原實現
location(x,y) 傳回此點是否在單元格,如果是傳回座標,如果不是傳回(-1,-1)
size() 傳回Widget控件大小。
propagate() 參數是True表示副父口大小由子控件決定,默認爲True

例子:列出執行前後Widget控件中的內容

import tkinter

# 創建主窗口
root = tkinter.Tk()
print("執行前", root.pack_slaves())
label1 = tkinter.Label(root, text="One",
                      bg="lightyellow")
label2 = tkinter.Label(root, text="Two",
                      bg="lightblue")
label3 = tkinter.Label(root, text="Three",
                      bg="lightgreen")
label1.pack(fill=tkinter.BOTH, side=tkinter.LEFT)
label2.pack(fill=tkinter.X)
label3.pack(fill=tkinter.BOTH, expand=1)
print("執行前", root.pack_slaves())
root.mainloop()

運行結果:

執行前 []
執行前 [<tkinter.Label object .!label>, <tkinter.Label object .!label2>, <tkinter.Label object .!label3>]

謝謝觀看,筆者會持續更新,如有錯誤或者建議,請私信我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章