Python的GUI编程之Pack、Place、Grid的区别说明

目录
  • GUI编程之 Pack、Place、Grid的区别
    • Pack 布局管理
    • Place 布局管理
    • Grid 布局管理
  • 布局管理器pack、 grid、 place
    • grid 布局管理器
    • pack 布局管理器
    • place 布局管理器

GUI编程之 Pack、Place、Grid的区别

本文讲述如何使用 tkinter 的布局管理 (被称作 layout managers 或 geometry managers). tkinter 有三种布局管理方式:

  • pack
  • grid
  • place

注意这三种布局管理在同一个 master window 里一定不可以混用! 布局管理有以下功能:

  • 将控件放置在屏幕上,包括控件的位置及控件的大小
  • 将控件注册到本地窗口系统中
  • 管理控件在屏幕上的显示

虽然控件自己也可以指定大小和对齐方式等信息, 但最终的控件大小及位置还是由布局管理决定的.

Pack 布局管理

pack 是三种布局管理中最常用的. 另外两种布局需要精确指定控件具体的显示位置, 而 pack 布局可以指定相对位置, 精确的位置会由 pack 系统自动完成. 这也使得 pack 布局没有另外两种布局方式灵活. 所以 pack 是

简单应用的首选布局

fill 控件填充方式

设置组件之间的间隙大小

  • ipadx,ipady设置内部间隙
  • padx,pady设置外部间隙
  • side 顺次放置控件

Place 布局管理

Place 布局管理可以显式的指定控件的绝对位置或相对于其他控件的位置. 要使用 Place 布局, 调用相应控件的 place() 方法就可以了. 所有 tkinter 的标准控件都可以调用 place()方法.

下面是一个使用 Place 布局的例子: 为 Label 控件设置随机的背景色, 然后计算各个 Label 的背景色的亮度(灰度值), 如果其亮度小于 120, 则将其前景色(文字颜色, fg属性)设置为白色, 否则设为黑色. 这样做是为了避免使背景色和前景色过于接近而导致文字不易阅读

Grid 布局管理

Pack 作为首选的布局管理方式,其运作方式并不是特别易于理解. 已经由 Pack 布局完成的设计也很难做出改变. Grid 布局在1996年作为另一种可供选择的布局方式被引入. Grid 布局方式易学易用, 但似乎大家还是习惯用 Pack.

Grid 在很多场景下是最好用的布局方式.相比而言, Pack 布局在控制细节方面有些力不从心. Place 布局虽然可以完全控制控件位置, 但这也导致使用 Place 会比其他两种布局方式更加复杂.

Grid 把控件位置作为一个二维表结构来维护,即按照行列的方式排列控件: 控件位置由其所在的行号和列号决定. 行号相同而列号不同的几个控件会被彼此上下排列; 列号相同而行号不同的几个控件会被彼此左右排列.

使用 Grid 布局的过程就是为各个控件指定行号和列号的过程. 不需要为每个格子指定大小, Grid 布局会自动设置一个合适的大小.

布局管理器pack、 grid、 place

一个 GUI 应用程序必然有大量的组件,这些组件如何排布? 这时候,就需要使用 tkinter提供的布局管理器帮助我们组织、 管理在父组件中子组件的布局方式。 tkinter 提供了三种管理器: pack、 grid、 place。

grid 布局管理器

grid 表格布局, 采用表格结构组织组件。 子组件的位置由行和列的单元格来确定, 并且可以跨行和跨列, 从而实现复杂的布局。

示例

from tkinter import *
from tkinter import messagebox
import random
class Application(Frame):
def __init__(self, master=None):
super().__init__(master) # super()代表的是父类的定义, 而不是父类
对象
self.master = master
self.pack()
self.createWidget()
def createWidget(self):
"""通过 grid 布局实现登录界面"""
self.label01 = Label(self,text="用户名")
self.label01.grid(row=0,column=0)
self.entry01 = Entry(self)
self.entry01.grid(row=0,column=1)
Label(self,text="用户名为手机号").grid(row=0,column=2)
Label(self, text="密码").grid(row=1, column=0)
Entry(self, show="*").grid(row=1, column=1)
Button(self, text="登录").grid(row=2, column=1, sticky=EW)
Button(self, text="取消").grid(row=2, column=2, sticky=E)
if __name__ == '__main__':
root = Tk()
root.geometry("400x90+200+300")
app = Application(master=root)
root.mainloop()

运行结果

pack 布局管理器

pack 按照组件的创建顺序将子组件添加到父组件中, 按照垂直或者水平的方向自然排布。 如果不指定任何选项, 默认在父组件中自顶向下垂直添加组件。

pack 是代码量最少, 最简单的一种, 可以用于快速生成界面。

【小灰灰建议】 如上列出了 pack 布局所有的属性, 但是不需要挨个熟悉, 了解基本的即可。pack 适用于简单的垂直或水平排布, 如果需要复杂的布局可以使用 grid 或 place。

【示例】 pack 布局用法, 制作钢琴按键布局

#coding=utf-8
from tkinter import *
root = Tk();root.geometry("700x220")
#Frame 是一个矩形区域, 就是用来防止其他子组件
f1 = Frame(root)
f1.pack()
f2 = Frame(root);f2.pack()
btnText = ("流行风","中国风","日本风","重金属","轻音乐")
for txt in btnText:
Button(f1,text=txt).pack(side="left",padx="10")
for i in range(1,20):
Button(f2,width=5,height=10,bg="black" if i%2==0 else
"white").pack(side="left")
root.mainloop()

place 布局管理器

place 布局管理器可以通过坐标精确控制组件的位置, 适用于一些布局更加灵活的场景。

示例

#coding=utf-8
from tkinter import *
root = Tk();root.geometry("500x300")
root.title("布局管理 place");root["bg"]="white"
f1 = Frame(root,width=200,height=200,bg="green")
f1.place(x=30,y=30)
Button(root,text="小灰灰").place(relx=0.5,rely=0,
x=100,y=200,relwidth=0.2,relheight=0.2)
Button(f1,text="小灰灰牛逼").place(relx=0.6,rely=0.7)
Button(f1,text="小灰灰真牛逼").place(relx=0.2,rely=0.2)
root.mainloop()

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 带你详细了解Python GUI编程框架

    目录 1. GUI编程类关系图 2. 常用组件方法 3.GUI面向对象写法 总结 1. GUI编程类关系图 我们来看看Tkinter 的GUI组件关系图 重要说明: 1.上述图表示的是相关类的继承关系图,从右到左子类继承父类. (1) 比如:组件Label Label继承->Widget类->继承Basewidget类->继承Misc类->继承Object父类 子类拥有父类的所有的属性和方法 2.Misc和Wim Tkinter 的 GUI组件有两个父类,它们直接继承了Object

  • Python GUI编程详解

    目录 Python GUI编程 项目学习. 1.点名器 a.导航栏 b.主体 c.逻辑 总结 Python GUI编程 0.创建窗口 import tkinter as tk #创建一个窗口 root = tk.Tk() root.mainloop() # 第2步,给窗口的可视化起名字 root.title('My Window') # 设置窗口最小和最大 root.minsize(300,300) root.maxsize(500,500) 1.Label和Button的使用 #!/usr/b

  • python 实现GUI(图形用户界面)编程详解

    Python支持多种图形界面的第三方库,包括: wxWidgets Qt GTK Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里.Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中. wxPython:wxPython 是一款开源软件,是 Python 语言的一套优秀的 GUI 图形库,允

  • Python GUI编程学习笔记之tkinter界面布局显示详解

    本文实例讲述了Python GUI编程学习笔记之tkinter界面布局显示.分享给大家供大家参考,具体如下: 相关内容: pack 介绍 常用参数 使用情况 常用函数 grid 介绍 常用参数 使用情况 常用函数 place 介绍 常用参数 使用情况 常用函数 首发时间:2018-03-04 14:20 pack: 介绍: pack几何管理器按行或列打包小部件. 可以使用填充fill,展开expand和靠边side等选项来控制此几何体管理器. pack的排放控件的形式就像将一个个控件按大小从上到

  • Python的GUI编程之Pack、Place、Grid的区别说明

    目录 GUI编程之 Pack.Place.Grid的区别 Pack 布局管理 Place 布局管理 Grid 布局管理 布局管理器pack. grid. place grid 布局管理器 pack 布局管理器 place 布局管理器 GUI编程之 Pack.Place.Grid的区别 本文讲述如何使用 tkinter 的布局管理 (被称作 layout managers 或 geometry managers). tkinter 有三种布局管理方式: pack grid place 注意这三种布

  • 详解Python GUI编程之PyQt5入门到实战

    1. PyQt5基础 1.1 GUI编程学什么 大致了解你所选择的GUI库 基本的程序的结构:使用这个GUI库来运行你的GUI程序 各种控件的特性和如何使用 控件的样式 资源的加载 控件的布局 事件和信号 动画特效 界面跳转 设计工具的使用 1.2 PyQT是什么 QT是跨平台C++库的集合,它实现高级API来访问现代桌面和移动系统的许多方面.这些服务包括定位和定位服务.多媒体.NFC和蓝牙连接.基于Chromium的web浏览器以及传统的UI开发.PyQt5是Qt v5的一组完整的Python

  • Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解

    目录 1.项目介绍 2.快速上手 3.官方文档介绍 接口文档(APIDocumentation) 主题(Themes) 画廊(Gallery) 1.项目介绍 ttkbootstrap 是一个基于 tkinter 的界面美化库,使用这个工具可以开发出类似前端 bootstrap 风格的 tkinter 桌面程序.如果会 tkinter 学习起来就会非常简单,如果不会的话只要先花两三天的时间系统学习一下 tkinter 之后再来使用 bootstrap 也是一样. ttkbootstrap 不仅有丰

  • java GUI编程之paint绘制操作示例

    本文实例讲述了java GUI编程之paint绘制操作.分享给大家供大家参考,具体如下: import java.awt.*; public class Testpint { public static void main(String[] args) { // new TFPaint().lunchPaint(); new TFPaint(); } } class TFPaint extends Frame{ /* public void lunchPaint() { this.setBoun

  • Python中线程编程之threading模块的使用详解

    threading.Thread Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入.下面分别举例说明.先来看看通过继承threading.Thread类来创建线程的例子: #coding=gbk import threading, time, random count = 0 cl

  • 网络编程之get与post的区别与联系

    区别与联系: 1.get是从服务器上获取数据,post则是向服务器传送数据: 2.get将表单中数据的按照variable=value的 形式,添加到action所指向的URL后面,并且两者使用"?"连接,而各个变量之间使用"&"连接.Post是将表单中的数据放在form的 数据体中,按照变量和值相对应的方式,传递到action所指向URL:fashion jewelry wholesale 所以从上述也可以得到另外两个结论: 1.get传送的数据量较小,不

  • Python编程之gui程序实现简单文件浏览器代码

    本文主要分享了关于在python中实现一个简单的文件浏览器的代码示例,代码及展示如下. #!/usr/bin/env python # -*- coding: UTF-8 -*- import os from time import sleep from Tkinter import * class DirList(object): def __init__(self, initdir=None): '''构造函数,说明版本信息''' self.top = Tk() self.label = L

  • Python网络编程之socket与socketserver

    目录 一.基于TCP协议的socket套接字编程 1.套接字工作流程 1. 服务端套接字函数 2. 客户端套接字函数 3. 公共用途的套接字函数 4. 面向锁的套接字方法 5. 面向文件的套接字的函数 2.基于TCP协议的套接字编程 1. 服务端 2. 客户端 3.地址占用问题 1. 方法一:加入一条socket配置,重用ip和端口 2. 方法二:通过调整linux内核参数 4.模拟ssh远程执行命令 5.粘包 1.发送端需要等缓冲区满才发送出去,造成粘包 2.接收方不及时接收缓冲区的包,造成多

  • python编程之requests在网络请求中添加cookies参数方法详解

    哎,好久没有学习爬虫了,现在想要重新拾起来.发现之前学习爬虫有些粗糙,竟然连requests中添加cookies都没有掌握,惭愧.废话不宜多,直接上内容. 我们平时使用requests获取网络内容很简单,几行代码搞定了,例如: import requests res=requests.get("https://cloud.flyme.cn/browser/index.jsp") print res.content 你没有看错,真的只有三行代码.但是简单归简单,问题还是不少的. 首先,这

  • Python编程之Re模块下的函数介绍

    re模块下的函数 compile(pattern):创建模式对象 import re pat=re.compile('A') m=pat.search('CBA') #等价于 re.search('A','CBA') print m <_sre.SRE_Match object at 0x9d690c8> #匹配到了,返回MatchObject(True) m=pat.search('CBD') print m None #没有匹配到,返回None(False) search(pattern,

随机推荐