Python Tkinter 窗口的管理与设置(四):布局管理器

Python爬虫、数据分析、网站开发等案例教程视频免费在线观看

https://space.bilibili.com/523606542

前言

什么是布局管理器?说白了就是管理你的那些组件如何排列的家伙。Tkinter有三个布局管理器,分别是pack、grid和place,其中:

pack是按添加顺序排列组件。

grid是按行/列形式排列组件。

place允许程序员指定组件的大小和位置。

pack

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

不要在同一个父组件中混合使用pack和grid,因为Tkinter会很认真地在那儿计算到底先使用哪个布局管理器……以至于你等了半个小时,Tkinter还在那儿纠结不出结果!

我们常常会遇到的一个情况是将一个组件放到一个容器组件中,并填充整个父组件。下面生成一个Listbox组件并将它填充到root窗口中:

import tkinter as tk
root = tk.Tk()
listbox = tk.Listbox(root)
listbox.pack(fill=tk.BOTH, expand=True)
for i in range(10):
  listbox.insert(tk.END, str(i)) 

root.mainloop()

其中,fill选项是告诉窗口管理器该组件将填充整个分配给它的空间,BOTH表示同时横向和纵向扩展,X表示横向,Y表示纵向;expand选项是告诉窗口管理器将父组件的额外空间也填满。

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

import tkinter as tk
root = tk.Tk()
tk.Label(root,text="Red",bg="red",fg="white").pack(fill=tk.X)
tk.Label(root,text="Green",bg="green",fg="black").pack(fill=tk.X)
tk.Label(root,text="Blue",bg="blue",fg="white").pack(fill=tk.X)
tk.mainloop()

如果想要组件横向挨个儿排列,可以使用side选项:

import tkinter as tk 

root = tk.Tk() 

tk.Label(root,text="Red",bg="red",fg="white").pack(side=tk.LEFT)
tk.Label(root,text="Green",bg="green",fg="black").pack(side=tk.LEFT)
tk.Label(root,text="Blue",bg="blue",fg="white").pack(side=tk.LEFT)
tk.mainloop()

grid

grid管理器可以说是Tkinter这三个布局管理器中最灵活多变的。当你在设计对话框的时候,使用gird尤其便捷。如果你此前一直在用pack构造窗口布局,那么学习完grid你会悔恨当初为啥不早学它。使用一个grid就可以简单地实现你用很多个框架和pack搭建起来的效果。

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

import tkinter as tk
root = tk.Tk()
# column默认值是0
tk.Entry(root).grid(row=0, column=0)
tk.Entry(root).grid(row=0, column=1)
tk.Entry(root).grid(row=0, column=3)
tk.Entry(root).grid(row=1, column=0)
# tk.Entry(root).grid(row=1, column=1)
tk.Entry(root).grid(row=1, column=3)
tk.mainloop()

登录表单

import tkinter as tk
root = tk.Tk()
root.geometry("300x300+150+150")
# column默认值是0
tk.Label(root, text="用户名").grid(row=0, column=0, sticky=tk.W)
tk.Entry(root) .grid(row=0, column=1)
tk.Label(root, text="密码") .grid(row=1, column=0, sticky=tk.W)
tk.Entry(root, show="*") .grid(row=1, column=1)
tk.mainloop()

默认情况下组件会居中显示在对应的网格里,你可以使用sticky选项来修改这一特性。该选项可以使用的值有E、W、S、N(EWSN分别表示东西南北,即上北下南左西右东)以及它们的组合。因此,可以通过sticky=W使得Label左对齐:

tk.Label(root, text="密码") .grid(row=1, column=0, sticky=tk.W)
tk.Entry(root, show="*") .grid(row=1, column=1)

有时候可能需要用几个网格来放置一个组件,可以做到吗?当然可以,只需要指定rowspan和columnspan就可以实现跨行和跨列的功能:

跨行和跨列布局

import tkinter as tk
root = tk.Tk()
# column默认值是0
tk.Label(root, text="用户名").grid(row=0,column=0,sticky=tk.W)
tk.Entry(root) .grid(row=0, column=1)
tk.Label(root, text="密码") .grid(row=1, column=0, sticky=tk.W)
tk.Entry(root, show="*") .grid(row=1, column=1)
photo = tk.PhotoImage(file="../../../assets/logo.png")
tk.Label(root,image=photo).grid(row=0,column=2,rowspan=2, padx=5, pady=5)
tk.Button(text="提交",width=10).grid(row=2,column=0,columnspan=3, pady=5)
tk.mainloop()

place

通常情况下不建议使用place布局管理器,因为对比起pack和grid,place要做更多的工作。不过纯在即合理,place在一些特殊的情况下可以发挥妙用。请看下面的例子。

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

import tkinter as tk
root = tk.Tk()
def callback():
  print("正中靶心") 

tk.Button(root, text="点我",command=callback).place(relx=0.5, rely=0.5, anchor=tk.CENTER)
tk.mainloop

在某种情况下,或许你希望一个组件可以覆盖另一个组件,那么place又可以派上用场了。下面例子演示用Button覆盖Label组件:

import tkinter as tk
root = tk.Tk()
def callback():
  print("正中靶心")
photo = tk.PhotoImage(file="../../assets/logo.png")
tk.Label(root, image=photo).pack()
tk.Button(root, text="点我",command=callback).place(relx=0.5, rely=0.5, anchor=tk.CENTER)
tk.mainloop()

利用 place 覆盖组件

不难看出,relx和rely选项指定的是相对于父组件的位置,范围是00~1.0,因此0.5表示位于正中间。那么relwidth和relheight选项则是指定相对于父组件的尺寸:

相对位置和相对尺寸

import tkinter as tk 

root = tk.Tk()
tk.Label(root, bg="red").place(relx=0.5, rely=0.5, relheight=0.75, relwidth=0.75, anchor=tk.CENTER)
tk.Label(root, bg="yellow").place(relx=0.5, rely=0.5, relheight=0.5, relwidth=0.5, anchor=tk.CENTER)
tk.Label(root, bg="green").place(relx=0.5, rely=0.5, relheight=0.25, relwidth=0.25, anchor=tk.CENTER)
tk.mainloop()

对于上面的代码,无论你如何拉伸改变窗口,三个 Label的尺寸均会跟着同步。

(0)

相关推荐

  • Tkinter 的三大布局管理器 pack、grid 和 place用法汇总

    学习python的tkinter免不了要对各个组件进行位置的排放与设定,常用的布局管理器有grid,pack和place.这三种均用于同一父组件下的组件布局,但是也是有区别的,先看下他们各自的含义吧. ...

  • (8条消息) Tkinter 组件详解(十一):Text

    Text(文本)组件用于显示和处理多行文本.在 Tkinter 的所有组件中,Text 组件显得异常强大和灵活,适用于多种任务.虽然该组件的主要目的是显示多行文本,但它常常也被用于作为简单的文本编辑器 ...

  • Python基础学习笔记(十三)图形化界面Tkinter

    本节知识大纲: 本节知识框架 Python里的图形化界面(GUI)模块主要有Tkinter(python自带).PyQt.wxPython,我们这节主要讲解Tkinter组件: 一.Tkinter介绍 ...

  • Python的门面担当

    在大多数时候,我们都在黑黢黢的控制台里执行 Python 脚本.这看起来很酷很 GEEK.但对于部分场景下的用户来说,这样就不大美观和人性化了:我们需要交互更方便的图形化产品,也就是 GUI(图形用户 ...

  • Tkinter 之Place布局

    import tkinter as tk    window = tk.Tk() # 设置窗口大小 winWidth = 600 winHeight = 400 # 获取屏幕分辨率 screenWid ...

  • Python Tkinter 窗口的管理与设置(三):窗口外形设置

    https://space.bilibili.com/523606542 1.设置透明度 # 透明度的值:0~1 也可以是小数点,0:全透明:1:全不透明 root.attributes(" ...

  • python tkinter窗口

    Python有多个图形开发界面的库,如wxPython.Jython等,本篇介绍的是Tkinter. Tkinter是Python的标准Tk GUI工具包的接口,可以在大多数的平台下使用. 要使用Tk ...

  • (2条消息) Python GUI之tkinter窗口视窗教程大集合(看这篇就够了)

    ahilll 2018-08-09 10:11:22 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 二.Tkinte ...

  • tkinter窗口的after方法 | Python笔记

    tkinter窗口,比如root窗口,以及Toplevel窗口,都有一个after方法.此方法执行后,将会在规定的时间间隔之后,执行一个特定的您指定的函数.如果在您指定的这个定时执行的函数中,再次调用 ...

  • Python Tkinter Grid布局管理器详解

    Grid(网格)布局管理器会将控件放置到一个二维的表格里.主控件被分割成一系列的行和列,表格中的每个单元(cell)都可以放置一个控件. 注意:不要试图在一个主窗口中混合使用pack和grid (1) ...

  • Python GUI之tkinter窗口视窗教程大集合(看这篇就够了)

    Tkinter支持16个核心的窗口部件,这个16个核心窗口部件类简要描述如下: Button:一个简单的按钮,用来执行一个命令或别的操作. Canvas:组织图形.这个部件可以用来绘制图表和图,创建图 ...

  • Python Tkinter Place布局管理器及用法

    Place 布局就是其他 GUI 编程中的"绝对布局",这种布局方式要求程序显式指定每个组件的绝对位置或相对于其他组件的位置. 如果要使用 Place 布局,调用相应组件的 pla ...

  • 绩效管理中的四个经典误区,你中招了吗

    目前,越来越多的医院开始实施绩效管理,或请咨询公司,或自己动手,基本上都有了绩效管理的概念.但是,似乎许多医院都遇到了一个同样的问题,人力资源部花费大量的时间和心血,制定了绩效管理方案.在方案的推销上 ...

  • 学会情绪管理的这四个方法,帮你踢走负能量

    情绪是隐藏在我们身上一种神奇的力量,它可以使我们沉着冷静,也可以使我们暴跳如雷:可以使我们精神焕发,也可以使我们萎靡不振.而情绪也可以主导事情发展的走向,比如说你尽早出门的时候不小心被人撞了一下,而那 ...