Python tkinter 从入门到放弃(布局函数)

 目录:Python tkinter 从入门到放弃(1)_BBBBBBBBBBBBBBBUG的博客-CSDN博客

文章目录:

一.pack()

1.基本用法

2.方位(上下左右中)用法

(1).上下左右

(2).居中放置

3.内边距和外边距

(1).在y轴上

(2).在x轴上

4.真正的上下左右

 5.特殊方位

二.grid()

1.堆叠用法

(1).有参数(row,column)

(2).无参数

2.合并用法

三.place()

 1.固定位置

2.比例位置

                                   还有很多函数,欢迎补充

附源码(注释已翻译):

pack函数

grid函数

place函数

一.pack()

注意:pack函数是一行一个控件(除fill),所以如果要让多个控件于一行上,请到grid()或place()

1.基本用法

import tkinter as tk    #导入tkinter模块
root = tk.Tk()    #创建窗口

label_1 = tk.Label(root,text = "我是一个标签")   #标签用法见Python tkinter 从入门到放弃标签
label_1.pack()

root.mainloop()    #消息循环

pack最基本的用法就是 控件变量.pack(),作用就是居中放置

pack()只在左右居中,没有上下居中 (但pack(expand = "yes")和其他参数可以 [dogs])

运行程序:

2.方位(上下左右中)用法

(1).上下左右

pack()   →   pack(tk.N/W/E/S)

import tkinter as tk    #导入tkinter模块
root = tk.Tk()    #创建窗口

bearing = ["上","左","右","下"]
bearing_p = [tk.N,tk.W,tk.E,tk.S]
           #(N:上,W:左,E:右,S:下)

for i in range(4):
         label_1 = tk.Label(root,text = f"我是一个{bearing[i]}标签")
         label_1.pack(anchor = bearing_p[i])

root.mainloop()    #消息循环

因为Label控件里是汉字,所以默认为16像素为一行,如图:

 效果:左标签和右标签可以随窗口的大小而改动,但上标签和下标签不行

(2).居中放置

pack() → pack(expand = "yes")

                           可替换为   ↓

                                   “no”或1或0

import tkinter as tk    #导入tkinter模块
root = tk.Tk()    #创建窗口

bearing = ["上","左","右","下"]
bearing_p = [tk.N,tk.W,tk.E,tk.S]
          #(N:上,W:左,E:右,S:下)
for i in range(4):
         label_1 = tk.Label(root,text = f"我是一个向{bearing[i]}的标签")
         label_1.pack(anchor = bearing_p[i])
         if i == 1:    #在第二个标签后插入
                  label_1 = tk.Label(root,text = f"我是一个居中的标签")
                  label_1.pack(expand = "yes")    #可改为"no",1,0
                  #label_1.pack(expand = "no")

root.mainloop()    #消息循环

expand是居中函数

当expand = "yes"或1时,如视频所示:

当expand = "no"或0时,如视频所示:

注意:expand不是整个窗口的中心,而是控件剩余位置的中心

详细参考:小白学tkinter(pack属性fill和expand)_代码_终结者的博客-CSDN博客_pack(fill)

3.内边距和外边距

(1).在y轴上

import tkinter as tk    #导入tkinter模块
root = tk.Tk()    #创建窗口

label_1 = tk.Label(root,text = f"我是一个标签",bg = "green",fg = "green")
#将label变成一个绿色的矩形
#label_1.pack()
label_1.pack(ipady = 10)    #label在y轴上内边距为10像素
label_1.pack(pady = 50)    #label在y轴上外边距为50像素

root.mainloop()    #消息循环

pack()的大小如图所示:

 pack(ipady = 10)#有内边距时大小如图所示:

内边距10像素就是把控件外延10像素

pack(pady = 50)#有外边距时大小如图所示:

 外边距50像素就是把控件外延50像素但不填充控件内容

(2).在x轴上

import tkinter as tk    #导入tkinter模块
root = tk.Tk()    #创建窗口

label_1 = tk.Label(root,text = f"我是一个标签",bg = "green",fg = "green")
#将label变成一个绿色的矩形
#label_1.pack()
label_1.pack(ipadx = 10)    #label在x轴上内边距为10像素
label_1.pack(padx = 50)    #label在x轴上外边距为50像素

root.mainloop()    #消息循环

pack()的大小如图所示:

 pack(ipadx = 10)#有内边距时大小如图所示:

内边距10像素就是把控件外延10像素

pack(padx = 50)#有外边距时大小如图所示:

 外边距50像素就是把控件外延50像素但不填充控件内容

4.真正的上下左右

pack()  → pack(side = "top"或“bottom”或"left"或“right”)

                                    #上           下          左        右

import tkinter as tk    #导入tkinter模块
root = tk.Tk()    #创建窗口

where = ["上","上","下","下","左","左","右","右"]
where_pack = ["top","top","bottom","bottom","left","left","right","right"]
for i in range(len(where)):
         label_1 = tk.Label(root,text = f"{where[i]}{i}")
         label_1.pack(side = where_pack[i])    #方位

root.mainloop()    #消息循环

运行程序:

注意:tk.S不能随窗口大小而改变,但side可以,如视频所示,如果继续编写的话,路径如图所示:

 5.特殊方位

pack()   →   pack(anchor = “方位(英文)”)

import tkinter as tk    #导入tkinter模块
root = tk.Tk()    #创建窗口

where = ["北","东北","东","东南","南","西南","西","西北"]    #方位(text)
pack_where = ["n","ne","e","se","s","sw","w","nw"]    #方位(pack())
for i in range(len(where)):
         label_1 = tk.Label(root,text = f"{where[i]}")
         label_1.pack(anchor = pack_where[i])    #放置

root.mainloop()    #消息循环

运行结果:

因为读者可能看不出来,所以改动了一下:

 其中,汉字底下的英文就是其对应的首字母(很重要!)

可惜的是它和tk.S一样,上下不能随窗口变化而变化

二.grid()

在学习grid之前,先引用一个知识点:窗口和坐标系;如图所示:

注:窗口的x,y只有正半轴,所以控件位置(x,y)任何一个小于0,控件就会显示不全或不显示

注意:grid()与pack()函数不能同时存在一个代码文件里

1.堆叠用法

(1).有参数(row,column)

import tkinter as tk    #导入tkinter模块
root = tk.Tk()    #创建窗口

num = 1
for i in range(5):
         for j in range(5):
                  label_1 = tk.Label(root,text = f"标签{num}   ")
                  label_1.grid(row = i,column = j)
                                 #行      #列
                  num += 1

root.mainloop()    #消息循环

运行:

它和pack的区别:pack从窗口坐标((长-标签长)/2,0)开始的,但grid从(0,0)开始的

grid(row = 横排个数,column = 竖排个数)

如图所示:

假如我想找”标签17“的row和column值,就可以按照这个表:

取得"标签17" 的row和column值为(1,3)

注意:row和column用法不会随窗口变化而变化,它只跟所堆叠的控件有关

(2).无参数

import tkinter as tk    #导入tkinter模块
root = tk.Tk()    #创建窗口

num = 1
for i in range(10):
    label_1 = tk.Label(root,text = f"标签{num}   ")
    label_1.grid()    #无参数的grid 就会沿着窗口的y轴排列
    num += 1

root.mainloop()    #消息循环

运行:

可见,如果grid函数内是空的,就往y轴(colum)堆叠,而x轴(row)终为0 

2.合并用法

import tkinter as tk    #导入tkinter模块
root = tk.Tk()    #创建窗口

num = 1
for i in range(5):
         for j in range(5):
                  label_1 = tk.Label(root,text = f"标签{num}   ")
                  label_1.grid(row = i,column = j,rowspan = 5,columnspan = 5)
                  num += 1

root.mainloop()    #消息循环

 运行:

 grid(rowspan = 在x轴上合并控件的个数,columnspan = 在y轴上合并控件的个数)

注意:rowspan和columnspan 都是正整数,不然会报错

(其实作者也不知道这到底有嘛用QAQ)

其他函数如:ipadx,ipady,pads,pady和pack()一样

pach函数用法详见:

一.pack()的使用

三.place()

在学习函数place之前,再引入一个概念:控件坐标

已知控件位置(x,y)中,任何一个参数小于0,这个控件就会显示不全或不显示

所以我们让控件坐标为(0,0)

如图:

 可见控件的左上角是控制控件位置的点:

 1.固定位置

import tkinter as tk    #导入tkinter模块
root = tk.Tk()    #创建窗口

label_1 = tk.Label(root,text = "我是一个位于(50,50)的标签")
label_1.place(x = 50,y = 50)    #在窗口的(50,50)位置

root.mainloop()    #消息循环

 运行程序:

可知:place(x = 标签在窗口x轴的位置,y = 标签在窗口y轴的位置) ,如图:

 注:place()函数不可以写成place(50,50)

2.比例位置

import tkinter as tk    #导入tkinter模块
root = tk.Tk()    #创建窗口

label_1 = tk.Label(root,text = "我是一个位于窗口中间的标签")
label_1.place(relx = 0.5,rely = 0.5)    #窗口长(宽)与模块位置(x,y)的比值

root.mainloop()    #消息循环

relx和rely函数是窗口长(宽)与模块位置(x,y)的比值 

因为控件坐标为控件的左上角而不在控件中心,所以看起来模块在窗口的中心偏右下,如图:

图中所示,黑线长度 = 红线长度绿线长度 = 黄线长度   (因为 relx = 0.5,rely = 0.5) 

                                   还有很多函数,欢迎补充

                                                                (作者比较懒)

附源码(注释已翻译):

pack函数

class Pack:
    """几何管理器 pack. base 类在每个小部件中使用 pack _ * 方法"""

    def pack_configure(self, cnf={}, **kw):
        """在父窗口小部件中打包一个窗口小部件:
        after = widget - 装好小部件后再打包
        anchor = NSEW (or subset) - 根据给定的方向定位组件
        before = widget - 在你打包小工具之前先打包
        expand = bool - 如果父大小增加,则展开小部件
        fill = NONE 或 X 或 Y 或 BOTH - 如果小部件增长,填充小部件
        in = master - 使用 master 来包含这个小部件
        in_ = master - 参见‘ in’选项描述
        ipadx = amount - 在 x 方向添加内部填充
        ipady = amount - 在 y 方向添加内部填充
        padx = amount - 在 x 方向添加填充
        pady = amount - 在 y 方向添加填充
        side = TOP 或 BOTTOM 或 LEFT 或 RIGHT -  在哪里添加这个小部件
        """
        self.tk.call(
              ('pack', 'configure', self._w)
              + self._options(cnf, kw))

    pack = configure = config = pack_configure

    def pack_forget(self):
        """Unmap this widget and do not use it for the packing order."""
        self.tk.call('pack', 'forget', self._w)

    forget = pack_forget

    def pack_info(self):
        """Return information about the packing options
        for this widget."""
        d = _splitdict(self.tk, self.tk.call('pack', 'info', self._w))
        if 'in' in d:
            d['in'] = self.nametowidget(d['in'])
        return d

    info = pack_info
    propagate = pack_propagate = Misc.pack_propagate
    slaves = pack_slaves = Misc.pack_slaves

grid函数

class Grid:
    """几何管理器网格。在每个小部件中使用grid_*方法的基类."""
    # Thanks to Masazumi Yoshikawa (yosikawa@isi.edu)

    def grid_configure(self, cnf={}, **kw):
        """将一个小部件放置在网格中的父小部件中:
        column = number - 使用用给定列标识的单元格(从0开始)
        columnspan = number - 这个小部件将跨多个列
        in = master - 使用 master 来包含这个小部件
        in_ = master - 参见‘ in’选项描述
        ipadx = amount - 在 x 方向添加内部填充
        ipady = amount - 在 y 方向添加内部填充
        padx = amount - 在 x 方向添加填充
        pady = amount - 在 y 方向添加填充
        row = number - 使用用给定行标识的单元格(从0开始)
        rowspan = number - 这个小部件将跨几行
        sticky = NSEW - 如果单元格较大,这个小部件会贴在单元格边界的哪一边
        """
        self.tk.call(
              ('grid', 'configure', self._w)
              + self._options(cnf, kw))

    grid = configure = config = grid_configure
    bbox = grid_bbox = Misc.grid_bbox
    columnconfigure = grid_columnconfigure = Misc.grid_columnconfigure

    def grid_forget(self):
        """映射这个小部件"""
        self.tk.call('grid', 'forget', self._w)

    forget = grid_forget

    def grid_remove(self):
        """取消这个小部件的映射,但记住网格选项。"""
        self.tk.call('grid', 'remove', self._w)

    def grid_info(self):
        """返回关于在网格中定位此小部件的选项的信息。"""
        d = _splitdict(self.tk, self.tk.call('grid', 'info', self._w))
        if 'in' in d:
            d['in'] = self.nametowidget(d['in'])
        return d

    info = grid_info
    location = grid_location = Misc.grid_location
    propagate = grid_propagate = Misc.grid_propagate
    rowconfigure = grid_rowconfigure = Misc.grid_rowconfigure
    size = grid_size = Misc.grid_size
    slaves = grid_slaves = Misc.grid_slaves

place函数

class Place:
    """类在每个小部件中使用 place _ * 方法"""

    def place_configure(self, cnf={}, **kw):
        """在父部件中放置一个部件:
        in = master - 相对于小部件放置的主控件
        in_ = master - 参见‘ in’选项描述
        x = amount - 将此小部件的锚定位于主控件的 x 位置
        y = amount - 将此小部件的锚定位于主控件的 y 位置
        relx = amount - 将此小部件的锚定位于相对于主控宽度(1.0为右边缘)在0.0和1.0之间
        rely = amount - 将此小部件的锚定位于相对于主控件高度(1.0为底部边缘)的0.0和1.0之间
        anchor = NSEW (或 subset) - 按给定方向定位锚
        width = amount - 此小部件的宽度(以像素为单位)
        height = amount - 此小部件的高度(以像素为单位)
        relwidth = amount - 此小部件的宽度相对于主控件的宽度介于0.0和1.0之间
                            (1.0与主控件的宽度相同)
        relheight = amount -  此小部件的高度相对于 master 的高度介于0.0和1.0之间
                              (1.0与master的高度相同)
        Bordermode = “ inside”或“ outside”-是否考虑主窗口小部件的边框宽度
        """
        self.tk.call(
              ('place', 'configure', self._w)
              + self._options(cnf, kw))

    place = configure = config = place_configure

    def place_forget(self):
        """取消映射这个小部件"""
        self.tk.call('place', 'forget', self._w)

    forget = place_forget

    def place_info(self):
        """返回有关此小部件的放置选项的信息"""
        d = _splitdict(self.tk, self.tk.call('place', 'info', self._w))
        if 'in' in d:
            d['in'] = self.nametowidget(d['in'])
        return d

    info = place_info
    slaves = place_slaves = Misc.place_slaves

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值