[关闭]
@yanglt7 2018-12-03T16:29:57.000000Z 字数 2901 阅读 1377

Tkinter10_布局管理器

Tkinter


Tkinter 有三个布局管理器,分别是 pack、grid 和 place,其中:

pack

对比 grid 管理器,pack 更适用于少量组件的排列,但它在使用上更简单。如果需要创建相对复杂的布局结构,那么建议是使用多个框架(Frame)结构,或者使用 grid 管理器实现。

tips:不要在同一个父组件中混合使用 pack 和 grid,因为 Tkinter 会计算到底先用哪个布局管理器。

例 50 将一个组件放到一个容器组件中,并填充整个父组件。下面生成一个 Listbox 组件并将它填充到 root 窗口中:

  1. from tkinter import *
  2. root = Tk()
  3. listbox = Listbox(root)
  4. listbox.pack(fill = BOTH, expand = True)
  5. # fill 告诉窗口管理器该组件将填充整个分配给它的空间
  6. # BOTH 表示同时横向和纵向扩展,X 表示横向,Y 表示纵向
  7. # expoand 选项告诉窗口管理器将父组件的额外空间也填满
  8. for i in range(10):
  9. listbox.insert(END, str(i))
  10. mainloop()

此处输入图片的描述

默认情况下,pack 是将添加的组件依次纵向排列:

  1. from tkinter import *
  2. root = Tk()
  3. Label(root, text="red", bg="red", fg="white").pack(fill=X)
  4. Label(root, text="green", bg="green", fg="black").pack(fill=X)
  5. Label(root, text="blue", bg="blue", fg="white").pack(fill=X)
  6. mainloop()

此处输入图片的描述

要实现组件横向排列,可以使用 side 选项:

  1. from tkinter import *
  2. root = Tk()
  3. Label(root, text="red", bg="red", fg="white").pack(side=LEFT)
  4. Label(root, text="green", bg="green", fg="black").pack(side=LEFT)
  5. Label(root, text="blue", bg="blue", fg="white").pack(side=LEFT)
  6. mainloop()

此处输入图片的描述

grid

grid 管理器可以说是 Tkinter 这三个布局管理器中最灵活多变的。当设计对话框的时候,使用 grid 尤为便捷。

使用 grid 排列组件,只需告诉它你想要将组件放置的位置(行/列,row 选项指定行,column 选项指定列)。此外,不需要指出网格(grid 分布给组件的位置称为网格)的尺寸,因为管理器会自动计算。

例 51

  1. from tkinter import *
  2. root = Tk()
  3. Label(root, text="用户名").grid(row=0)
  4. Label(root, text="密码").grid(row=1)
  5. Entry(root).grid(row=0, column=1)
  6. Entry(root, show="*").grid(row=1, column=1)
  7. mainloop()

此处输入图片的描述

默认情况下组件会居中显示在对应的网格例,可以使用 sticky 选项来修改这一特性。该选项可以使用的值有 E、W、S、N(东西南北)以及它们的组合。

因此,可以使用 sticky=W 使 Label 左对齐:

  1. ...
  2. Label(root, text="用户名").grid(row=0, sticky=W)
  3. Label(root, text="密码").grid(row=1, sticky=W)
  4. ...

此处输入图片的描述

可以指定 rowspan 和 columnspan 实现跨行和跨列的功能:

  1. from tkinter import *
  2. root = Tk()
  3. Label(root, text="用户名").grid(row=0, sticky=W)
  4. Label(root, text="密码").grid(row=1, sticky=W)
  5. photo = PhotoImage(file="logo.gif")
  6. Label(root, image=photo).grid(row=0, column=2, rowspan=2, padx=5, pady=5)
  7. Entry(root).grid(row=0, column=1)
  8. Entry(root, show="*").grid(row=1, column=1)
  9. Button(text="提交", width=10).grid(row=2, columnspan=3, pady=5)
  10. mainloop()

此处输入图片的描述

place

例 52 使用 place,可以将子组件显示在父组件的正中间:

  1. from tkinter import *
  2. root = Tk()
  3. def callback():
  4. print("正中靶心!")
  5. Button(root, text="点我", command=callback).place(relx=0.5, rely=0.5, anchor=CENTER)
  6. # relx 和 rely 选项指定的是相对于父组件的位置,范围是 0.0~1.0
  7. mainloop()

此处输入图片的描述

Button 组件覆盖 Label 组件:

  1. from tkinter import *
  2. root = Tk()
  3. photo = PhotoImage(file="logo_big.gif")
  4. Label(root, image=photo).pack()
  5. def callback():
  6. print("正中靶心!")
  7. Button(root, text="点我", command=callback).place(relx=0.5, rely=0.5, anchor=CENTER)
  8. mainloop()

此处输入图片的描述

relwidth 和 relheight 选项则是指定相对于父组件的尺寸:

  1. from tkinter import *
  2. root = Tk()
  3. Label(root, bg="red").place(relx=0.5, rely=0.5, relheight=0.75, relwidth=0.75, anchor=CENTER)
  4. Label(root, bg="yellow").place(relx=0.5, rely=0.5, relheight=0.5, relwidth=0.5, anchor=CENTER)
  5. Label(root, bg="green").place(relx=0.5, rely=0.5, relheight=0.25, relwidth=0.25, anchor=CENTER)
  6. mainloop()

无论如何拉伸改变窗口,三个 Label 的尺寸均会跟着同步。

此处输入图片的描述

摘自《零基础入门学习Python》

参考链接:

An Introduction To Tkinter
Tkinter汇总
Python GUI编程(Tkinter)
Tkinter颜色方案举例
python tkinter可以使用的颜色
tkinter学习-菜单与画布
程序设计思想与方法--第五章
用Python中的tkinter模块作图

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注