Tkinter控件有特定的几何状态管理方法,管理整个控件区域组织,以下是Tkinter公开的几何管理类:包、网格、位置。

几何方法 描述
pack() 包装
grid() 网格
place() 位置

一、pack 包装

(一)pack选项

pack方法会从上到下,从左到右的摆放控件。

1.side

side的作用是放置控件的位置。有四个位置:left,right,top,bottom。LEFT:由左往右排列,RIGHT:由右往左排列,TOP:默认值,由上往下排列,BOTTOM:由下往上排列。

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='left')
b1.pack(side = tk.LEFT)
b2 = tk.Label(init_window,text='right')
b2.pack(side = tk.RIGHT)
b3 = tk.Label(init_window,text='top')
b3.pack(side=tk.TOP)
b4 = tk.Label(init_window,text='bottom')
b4.pack(side=tk.BOTTOM)
init_window.mainloop()

2.expand

正常的情况使用pack,此标签就在窗口的顶部居中显示。当expand值为True时,side选项无效。控件显示在父控件中心位置。expand取值:“yes”,“no”,“y”,“n”,“True”,“False”(默认值为"no"或0)

##标签左右、垂直居中
import tkinter
from tkinter import *
init_window = Tk()  ## 实例化出一个父窗口
init_window.geometry('300x240')
label = Label(init_window, text="图像在左",compound="left",bitmap="error")
label.config(font="Helvetic 20 overstrike",cursor="shuttle")
label.pack(expand='yes')
init_window.mainloop()

3.fill

fill 参数的主要功能是告诉 pack管理程序,设置控件填满所分配容器区间的方式
参数:
fill = X:表示控件可以填满所分配空间的X轴不留白
fill = Y:表示控件可以填满所分配空间的Y轴不留白
fill = BOTH:表示控件可以填满所分配空间的X轴和Y轴
fill默认值为NONE,表示保持原大小

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
l = tk.Label(init_window,text='这是一个标签',bg='pink')
l.pack(expand='true',fill='x')
init_window.mainloop()

4.padx、pady、ipadx、ipady

  • padx:可以设置标签文字左右边界与标签区间的x轴间距。
  • pady:可以设置标签文字上下边界与标签区间的y轴距离。
  • ipadx:标签内部的文字与小框框的水平距离
  • ipady:标签内部的文字与小框框的垂直距离
import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
l1 = tk.Label(init_window,text='这是一个对照标签',bg='pink')
l1.pack(expand='true')
l2 = tk.Label(init_window,text='标签内部的文字与小框框的距离',bg='blue')
l2.pack(expand='true',ipadx=20,ipady=40)
init_window.mainloop()

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1',bg='pink')
b1.pack()
b2 = tk.Label(init_window,text='文本2',bg='pink')
b2.pack(pady=10)
b3 = tk.Label(init_window,text='文本3',bg='pink')
b3.pack(pady=(10,30))
b4 = tk.Label(init_window,text='文本4',bg='pink')
b4.pack()
b5 = tk.Label(init_window,text='文本5',bg='pink')
b5.pack(side='left')
b6 = tk.Label(init_window,text='文本6',bg='pink')
b6.pack(side='left',padx=20)
init_window.mainloop()

5.before、after、in_

before 和after可以改变pack控件的次序。in_的作用是设置当前控件的父控件,可以替换掉在控件初始化时候的父控件。

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2')
b2.pack()
b3 = tk.Label(init_window,text='文本3被提前到文本2之前pack')
b3.pack(before=b2)
init_window.mainloop()

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2',bg='blue')
b2.pack()
b3 = tk.Label(init_window,text='文本3被放在文本2中')
b3.pack(in_=b2)
init_window.mainloop()

(二)pack函数

函数名 描述
slaves() 以列表方式返回本控件的所有子控件对象
propagate(flag) 设置为True表示父控件的几何大小由子控件决定(默认值),反之则无关
info() 返回pack提供的选项所对应的数值,返回值为字典类型
forget() 将控件隐藏并且忽略原有设置,对象依旧存在
pack() 显示控件

1.slaves ()函数

slaves()函数返回本控件的所有子控件对象。如果不使用pack(),就算已经实例化了子控件,slaves()也不会输出没有pack()的子控件。比如b4就不会输出。而b2和b3会被认为是b1的子控件。

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(b1,text='文本2')
b2.pack()
b3 = tk.Label(b1,text='文本3')
b3.pack()
b4 = tk.Label(b1,text='文本4')
print(b1.slaves())
init_window.mainloop()

2.propagate(flag)函数

该函数决定父控件的大小是否与子控件有关。如果flag是True则父控件的大小为包括子控件的大小。如果flag是False,则表示父控件的大小与子控件无关。不过geometry()会让propagate()失效,窗口的大小由geometry()决定。

import tkinter as tk
init_window = tk.Tk()
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2')
b2.pack()
b3 = tk.Label(init_window,text='文本3')
b3.pack()
init_window.propagate(False)
init_window.mainloop()

import tkinter as tk
init_window = tk.Tk()
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2')
b2.pack()
b3 = tk.Label(init_window,text='文本3')
b3.pack()
init_window.propagate(True)
init_window.mainloop()

3.info() 函数

info()返回控件的信息。这些信息以字典的形式返回。

import tkinter as tk
init_window = tk.Tk()
b1 = tk.Label(init_window,text='文本1')
b1.pack()
print(b1.info())
init_window.mainloop()

4.forget() 函数

forget()函数是隐藏控件的。调用之后,该控件从父控件中消失。但是该控件的实例还是存在的。可以用pack()直接恢复显示这个控件。pack()是按照次序来的。以pack()的次序为准,而不是以实例化的次序。

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2')
b2.pack()
b3 = tk.Label(init_window,text='文本3')
b3.pack()
def b3_forget():b3.forget()
def b3_pack():b3.pack()
b4 = tk.Button(init_window,text='隐藏文本3',command=b3_forget)
b4.pack()
b5 = tk.Button(init_window,text='显示文本3',command=b3_pack)
b5.pack()
init_window.mainloop()
#点击’隐藏文本3’按钮后,’文本3’的标签消失。
#再点击’显示文本3’按钮,则显示’文本3’

运行代码

点击隐藏文本

点击显示文本

二、grid网格

(一)grid选项

grid布局管理采用类似表格的结构来管理控件的,把窗口用单元格的形式来定位,可以像编辑表格一样放置控件。grid采用行列确定位置,行列交汇处为一个单元格。每一列中,列宽由这一列中最宽的单元格确定。每一行中,行高由这一行中最高的单元格决定。

名称 描述
column 控制所置单元格的列号
columnspan 从控件所置单元格算起在列方向上的跨度
row 控制所置单元格的行号
rowspan 从控件所置单元格算起在行方向上的跨度
ipadx、ipady 标签内部的文字与小框框的距离
padx、pady 设置标签文字边界与标签区间的间距
in_ 将本控件作为所选组建对象的子控件
sticky 功能类似anchor,但是只可以设定N/S/W/E,即上/下/左/右对齐

注:相同column的Widget 控件,如果宽度不同的话,grid方法会保留最宽的控件当做基准,这时比较短的件会居中对齐。

1.row、column、rowspan、columnspan

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='跨\n两\n行',bg='pink')
b1.grid(row=0,column=0,rowspan=2)
b2 = tk.Label(init_window,text='跨两列',bg='yellow')
b2.grid(row=0 ,column=1,columnspan=2)
b3 = tk.Label(init_window,text='文本3',bg='cyan')
b3.grid(row=1,column=1)
b4 = tk.Label(init_window,text='文本4',bg='cyan')
b4.grid(row=1,column=2)
init_window.mainloop()

2.sticky

sticky的参数可以组合使用

参数 含义
sticky=N+S 可以拉长高度,让控件在顶端和底端对齐
sticky=W+E 可以拉长宽度,让控件在左边和右边对齐
sticky=N+S+E 可以拉长高度,让控件在顶端和底端对齐,同时切齐右边
sticky=N+S+W 可以拉长高度,让控件在顶端和底端对齐,同时切齐左边
sticky=N+S+W+S 可以拉长高度,让控件在顶端和底端对齐,同时切齐左右边
import tkinter as tk
init_window = tk.Tk()
label1 = tk.Label(init_window, text="One", relief="raised")
label2 = tk.Label(init_window, text="TwoTwoTwo", relief="raised")
label1.grid(row=0, column=0, sticky=tkinter.W + tkinter.E)
label2.grid(row=1, column=0)
init_window.mainloop()

(二)grid函数


1.forget、remove

forget控件后,不会记住当前位置,重新显示时,会按提交顺序显示。remove控件后,会记住当前位置,重新显示时,还在控件原位置。

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.grid(row=0, column=0)
def b1_forget():b1.grid_forget()
def b1_grid():b1.grid()
def b1_remove():b1.grid_remove()
b2 = tk.Button(init_window,text='foget文本',command=b1_forget)
b2.grid(row=1, column=0)
b3 = tk.Button(init_window,text='remove文本',command=b1_remove)
b3.grid(row=2, column=0)
b4 = tk.Button(init_window,text='显示文本1',command=b1_grid)
b4.grid(row=3, column=0)
init_window.mainloop()

代码运行

forget

remove

2.grid_location(x,y)

返回坐标位置所在的单元格的行列坐标。

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Canvas(init_window,bg='blue',width=40,height=80)
b1.grid(row=0,column=0,rowspan=2)
b2 = tk.Canvas(init_window,bg='yellow',width=80,height=40)
b2.grid(row=0 ,column=1,columnspan=2)
b3 = tk.Canvas(init_window,bg='cyan',width=40,height=40)
b3.grid(row=1,column=1)
b4 = tk.Canvas(init_window,bg='gray',width=40,height=40)
b4.grid(row=1,column=2)
i=30
j=120
m = init_window.grid_location(i,j)
print("i=",i,"j=",j,m)
init_window.mainloop()


坐标位置在(30,120)的单元格在第1行,第3列的位置。

3.grid_rowconfigure()、grid_columnconfigure()

在设计控件的布局时,有时候会碰上窗口缩放大小,此时可以使用这两个方法设定第几行row或者是column的缩放比例。

import tkinter as tk
init_window = tk.Tk()
init_window.rowconfigure(1, weight=1)  ## 第二行按比例1缩放
init_window.columnconfigure(0, weight=1)  ## 第一列按比例1缩放label1 = tk.Label(init_window, text="Label 1", bg="red")
label1.grid(row=0, column=0, padx=5, pady=5, sticky=tkinter.W)label2 = tk.Label(init_window, text="Label 2", bg="blue")
label2.grid(row=0, column=1, padx=5, pady=5)label3 = tk.Label(init_window, text="Label 3", bg="green")
label3.grid(row=1, column=0, columnspan=2, padx=5, pady=5, sticky=tkinter.N+tkinter.S+tkinter.W+tkinter.E)init_window.mainloop()

三、place位置

place方法是最简单的一种布局方法,只需指定控件的显示位置即可。

(一)place选项

1.x、y、relx、rely

x、y指定在何处显示控件。relx和rely也是设定子控件的位置的。不过是相对的位置。取值范围是0~1。如果同时设定了x和y,那么就是把计算出来的相对位置与x,y分别相加,得出来的就是该控件的位置。
比如x=50,y=50,relx=0.5,rely=0.5,而父控件的大小是280和230(必须设定父控件的大小。否则,不会显示子控件),那么该控件的位置就是:
x = 50 + 2800.5 = 50+140 = 190
y = 50 + 230
0.5 = 50+115 = 165

(二)place函数

Python之Tkinter控件几何管理类相关推荐

  1. wxpython制作表格界面_[Python] wxPython 菜单栏控件学习总结(原创)

    1.总结 1.大体创建过程 1.创建一个 菜单栏 : menuBar = wx.MenuBar() 相当于这个白色地方,没有File这个菜单 2.创建 菜单 : fileMenu = wx.Menu( ...

  2. python tkinter控件_如何实现python tkinter控件随窗口变化?

    不管是对于Java还是对于Python,我们最开始学习的时候,都会碰到关于开发上的窗口设置,如果不设置这个内容,你所呈现的项目效果,是非常不美观的,而往往为了符合美化,大家都会花费很多心思在基础的窗口 ...

  3. python控件随窗口变化而适配_如何实现python tkinter控件随窗口变化?

    不管是对于Java还是对于Python,我们最开始学习的时候,都会碰到关于开发上的窗口设置,如果不设置这个内容,你所呈现的项目效果,是非常不美观的,而往往为了符合美化,大家都会花费很多心思在基础的窗口 ...

  4. python tkinter界面 控件位置随窗体自动调整适应_如何实现python tkinter控件随窗口变化?...

    不管是对于Java还是对于Python,我们最开始学习的时候,都会碰到关于开发上的窗口设置,如果不设置这个内容,你所呈现的项目效果,是非常不美观的,而往往为了符合美化,大家都会花费很多心思在基础的窗口 ...

  5. python获取窗口控件属性_Python——tkinter窗口视窗的功能部件

    tkinter简介 Tkinter 是使用 python 进行窗口视窗设计的模块.Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.作为 pytho ...

  6. python tkinter控件_Python——Tkinter窗口的函数,Pythontkinter,视窗,功能,部件

    tkinter简介 Tkinter 是使用 python 进行窗口视窗设计的模块.Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.作为 pytho ...

  7. python tkinter控件_python GUI作业:使用tkinter的重要控件

    题目1:使用tkinter的重要控件 绘制如下菜单: 图片.png 参考代码:#!/usr/bin/env python3# -*- coding: utf-8 -*-# 技术支持:https://w ...

  8. Python Tkinter控件之 Label 详解

    (Label)标签控件被用于显示文本和图像.标签可包含多行文本,但只能用一种字体. Python Tkinter 标签控件(Label):指定的窗口中显示的文本和图像 注:你如果需要显示一行或多行文本 ...

  9. python tkinter控件treeview的数据列表显示的实现_code

    素材文件 result.txt result2.txt result.txt文件的数据来源是爬取猫眼电影前一百名的电影,而result2.txt文件只不过是内容上把result.txt的内容复制几十次 ...

最新文章

  1. ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页
  2. V8 Design Elements(翻译)
  3. 【附可运行代码】剑指 Offer 12. 矩阵中的路径
  4. 如何判断微信内置浏览器(JS PHP)
  5. 通过I2C总线向EEPROM中写入数据,记录开机次数
  6. 【机械仿真】基于matlab GUI凸轮设计与仿真【含Matlab源码 153期】
  7. Webduino Smart 从入门到起飞
  8. python如何截长图_python如何实现对元素的长截图功能 python实现对元素的长截图功能实例...
  9. windows7自带的计算机,win7电脑自带投屏吗?
  10. vb.net 简单取摄像头图片_简单的BP网络识别液晶字符
  11. 路由器管理页面html,电脑怎么进入路由器设置界面_怎么登录路由器管理界面?-192路由网...
  12. 暑期旅游超十亿人次,张家界成为大黑马,挤掉三亚西安排全国第三
  13. steam饥荒服务器为什么显示未响应,《饥荒:联机版》服务器卡顿原因分析及解决教程...
  14. 新版白话空间统计(9):置信度的初探
  15. 微信小程序 —— 模块化方法的总结
  16. 帝国CMS和PHPCMS对比随谈
  17. java 采集新闻数据
  18. 第四章 函数的故事(1)超详!!!
  19. Word内的表格如何自动计算?
  20. leetcode_hot10-

热门文章

  1. Java FFmpeg的音视频处理
  2. 初级会计--税法公式大全(五)
  3. 6-4 修改学生成绩 (15 分)
  4. 人与人相处的本质就是价值交换
  5. shiro的通过md5+salt+hash散列进行注册操作
  6. android 手势旋转,android中手势操作图片的平移、缩放、旋转
  7. 一种无监督语义分割算法:Unsupervised Semantic Segmentation using Invariance and Equivariance in Clustering
  8. c++网络编程——用TCP实现文件传输(windows下基于VS2017)
  9. 图片二维码怎么批量制作
  10. 西部数据(WD)固件级数据恢复案例