Tkinter place() 布局入门示例
-
几何管理
Tkinter控件有特定的几何状态管理方法,管理整个控件区域组织,以下是Tkinter公开的几何管理类:包、网格、位置
几何方法 描述 pack() 包装; https://www.cnblogs.com/emanlee/p/15340485.html grid() 网格; https://www.cnblogs.com/emanlee/p/15340537.html place() 位置; https://www.cnblogs.com/emanlee/p/15337638.html
B站视频教程:https://www.bilibili.com/video/BV1nu411D7ff/
place() 方法设置控件在窗体或窗口内的绝对地址或相对地址。
1. place()方法参数选项
Place 布局就是其他 GUI 编程中的“绝对布局”,这种布局方式要求程序显式指定每个组件的绝对位置或相对于其他组件的位置。
如果要使用 Place 布局,调用相应组件的 place() 方法即可。在使用该方法时同样支持一些详细的选项,关于这些选项的介绍如下:
参数 | 作用 |
---|---|
anchor | 控制组件在 place 分配的空间中的位置 "n", "ne", "e", "se", "s", "sw", "w", "nw", 或 "center" 来定位(ewsn代表东西南北,上北下南左西右东) 默认值是 "nw" |
bordermode | 指定边框模式("inside" 或 "outside") 默认值是 "inside" |
height | 指定该组件的高度(像素) |
in_ | 将该组件放到该选项指定的组件中 指定的组件必须是该组件的父组件 |
relheight | 指定该组件相对于父组件的高度(relative height) 取值范围 0.0 ~ 1.0 |
relwidth | 指定该组件相对于父组件的宽度(relative width) 取值范围 0.0 ~ 1.0 |
relx |
指定该组件相对于父组件的水平位置(relative x) 和anchor结合使用,指anchor所指的位置 |
rely |
指定该组件相对于父组件的垂直位置(relative y) 和anchor结合使用,指anchor所指的位置 |
width | 指定该组件的宽度(像素) |
x |
指定该组件的水平偏移位置(像素) 和anchor结合使用,指anchor所指的位置 |
y |
指定该组件的垂直偏移位置(像素) 和anchor结合使用,指anchor所指的位置 |
当使用 Place 布局管理容器中的组件时,需要设置组件的 x、y 或 relx、rely 选项,Tkinter 容器内的坐标系统的原点 (0,0) 在左上角,其中 X 轴向右延伸,Y 轴向下延伸,如图所示
如果通过 x、y 指定坐标,单位就是 pixel(像素);如果通过 relx、rely 指定坐标,则以整个父容器的宽度、高度为 1。不管通过哪种方式指定坐标,通过图 1 不难发现,通过 x 指定的坐标值越大,该组件就越靠右;通过 y 指定的坐标值越大,该组件就越靠下。
2. place()方法应用实例
from tkinter import * master = Tk()# creating Tk window master.geometry("200x200") # button widget b1 = Button(master, text = "Click me !") b1.place(relx = 1, y = 2, anchor = NE) # label widget l = Label(master, text = "I'm a Label") l.place(anchor = NW) # button widget b2 = Button(master, text = "GFG") b2.place(relx = 0.5, rely = 0.5, anchor = CENTER) # infinite loop which is required to # run tkinter program infinitely until an interrupt occurs mainloop()
relx 和 anchor 配合起来用:
如果 relx=0,anchor=NE,那么,按钮的右侧边缘处于relx=0位置。
如果 relx=0,anchor=NW,那么,按钮的左侧边缘处于relx=0位置。
如果 relx=0.1,anchor=NE,那么,按钮的右侧边缘处于relx=0.1位置。
如果 relx=0.5,anchor=NE,那么,按钮的右侧边缘处于relx=0.5位置。
如果 relx=0.9,anchor=NE,那么,按钮的右侧边缘处于relx=0.9位置。
如果 relx=1,anchor=NE,那么,按钮的右侧边缘处于relx=1位置。
如果 relx=0,anchor=NW,那么,按钮的左侧边缘处于relx=0位置。
from tkinter import * master = Tk()# creating Tk window master.geometry("200x200") # button widget b1 = Button(master, text = "Click me !") b1.place(x =100, y = 100, width=50,height=50, anchor = SW) mainloop()
from tkinter import * master = Tk()# creating Tk window master.geometry("200x200") # button widget b1 = Button(master, text = "Click me !") b1.place(x =100, y = 100, width=50,height=50, anchor = NE) mainloop()
下面的示例是使用 place() 方法创建两个按钮。第一个按钮的位置在距离窗体左上角的 (40,40) 坐标处,第二个按钮的位置在距离窗体左上角的 (140, 80) 坐标处。按钮的宽度均为 80 像素,高度均为 40 像素。
#place()方法
from tkinter import *
#主窗口
win = Tk()
#创建窗体
frame = Frame (win, relief=RAISED, borderwidth=2, width=400, height=300)
frame.pack(side=TOP, fill=BOTH,ipadx=5, ipady=5, expand=1)
#第一个按钮的位置在距离窗体左上角的(40,40)坐标处
button1 = Button ( frame, text="Button 1")
button1.place(x=40,y=40, anchor=W, width=80, height=40)
#第二个按钮的位置在距离窗体左.上角的(140,80) 坐标处
button2 = Button (frame, text="Button 2")
button2.place(x=140,y=80, anchor=W, width=80, height=40)
#开始窗口的事件循环
win. mainloop()
保存 demo1.pyw 文件后,直接双击运行该文件,结果如图 1 所示:
![程序运行结果](http://www.weixueyuan.net/uploads/allimg/200827/7-200RG51644G3.gif)
图:程序运行结果
示例代码分析如下:
- 第 6 行:创建一个 Frame 控件,以作为窗体。此窗体的外形突起,边框厚度为 2 像素。窗体的宽度是 400 像素,高度是 300 像素。
- 第 7 行:此窗体在窗口的顶端(side=TOP),当窗口改变大小时,窗体会占满整个窗口的剩余空间(fill=BOTH)。widget 与窗体边界之间的水平距离是5像素,垂直距离是 5 像素。
- 第 13~11 行:创建第一个按钮。位置在距离窗体左上角的(40, 40)坐标处,宽度是 80 像素,高度是 40 像素。
- 第 14~15 行:创建第二个按钮。位置在距离窗体左上角的(140, 80)坐标处,宽度是 80 像素,高度是 40 像素。
当我们使用pack()或grid()管理器时,将两个不同的小部件彼此分开放置是非常容易的,但是将其中一个放置在另一个内部则有点困难。但这可以通过place()方法轻松实现。在place()方法中,我们可以使用in_选项将一个小部件放在另一个小部件内。
# Importing tkinter module from tkinter import * # creating Tk window master = Tk() # setting geometry of tk window master.geometry("200x200") # button widget b2 = Button(master, text = "GFG") b2.pack(fill = X, expand = True, ipady = 10) # button widget b1 = Button(master, text = "Click me !") # This is where b1 is placed inside b2 with in_ option b1.place(in_= b2, relx = 0.5, rely = 0.5, anchor = CENTER) # label widget l = Label(master, text = "I'm a Label") l.place(anchor = NW) # infinite loop which is required to # run tkinter program infinitely # until an interrupt occurs mainloop()
REF
https://www.cnblogs.com/yang-2018/p/11791906.html
https://blog.csdn.net/nilvya/article/details/106148018
https://www.py.cn/jishu/jichu/10893.html
https://vimsky.com/examples/usage/python-place-method-in-tkinter.html