基于Tkinter的PanedWindow组件进行窗口布局

news2024/11/14 18:41:09

        在用Tkinter进行可视化界面开发中,界面布局是最需要最先考虑的,哪些组件放在什么地方都需要优先规划,我们可以用place或者pack进行边开发边布局,这需要人为的去对齐,费时费力。在Tkinter中有个组件PanedWindow可以帮助我们在顶层进行窗口布局设计,具体组件放到布局好的窗口中,不需要我们手工去对齐组件。

一:PanedWindow组件介绍

        PanedWindow(窗格界面)是 Tkinter 8.4 版本后新增的空间管理组件,其主要目的是为其他组件提供一个容器或者框架,从而实现以分块的形式对图形界面进行布局。

        PanedWindow 允许用户自主地调整界面划分以及每块区域的大小。因此,当您需要让用户自己调节每块区域的大小时,就可以采用 PanedWindow 作为组件载体来进行界面的布局。

        不仅如此 PanedWindow 组件还提供了“手柄” 功能(设置参数 showhandle=True 来启用),通过拖动“手柄”图标也可以改变每块区域的大小。

        PanedWindow 组件语法格式如下所示:

PanedWindow(master=None, **options) 

        其中 master 表示父组件,即包裹该组件的上层组件 

二:PanedWindow组件属性和方法

PanedWindow常用属性如下表所示:

属性说明
handlepad1. 调节“手柄”的位置
2. 比如当 orient ='vertical' 设置垂直时,handlepad 表示“分割线”上的手柄与左端的距离,默认为 8 像素
handlesize设置“手柄”的尺寸(由于“手柄”必须是一个正方形,所以是设置正方形的边长)默认为 8 像素
opaqueresize1. 该选项定义了用户调整窗格尺寸的操作,如果该选项的值为 True(默认),窗格的尺寸随用户鼠标的拖拽而改变
2.  如果该选项的值为 False,那么窗格的尺寸,在用户释放鼠标时才会更新到新的位置上
orient指定窗格的分布方式,默认为水平方向分布("horizontal"),或者还可以设置为垂直纵向分布("vertical")
relif指定边框的样式,默认为 "flat",还可以设置为  "sunken","raised","groove" 或 "ridge"
sashpad设置每一条分割线到窗格间的间距
sashrelief设置分割线的样式,默认值是:"flat",还可以设置 "sunken","raised","groove" 或 "ridge"
sashwidth设置分割线的宽度
showhandle设置是否显示调节窗格的手柄,默认为 False
height/width设置 PanedWindow 的高度、宽度,若不设置,则其大小由其子组件的尺寸决定

PanedWindow常用方法如下表所示 :

方法说明
add(child)添加一个新的子组件到窗格中语法格式 add(child,**option),参数值 after、before、sticky
forget(child)删除一个子组件
panecget(child, option)获得子组件指定选项的值
paneconfig(child, **options)设置子组件的各种选项
panes()将父组件中包含的子组件以列表的形式返回
sash_coord(index)返回一个二元组表示指定分割线的起点坐标
sash_place(index, x, y)将指定的分割线移动到一个新的位置

三: PanedWindow组件实例

1,创建两个横向切割的窗口

from tkinter import *
 
root=Tk()
root.geometry('300x300')
 
pw1=PanedWindow(root,orient=VERTICAL,bg='red') # 创建纵向分割面板,背景红色
pw1.pack(fill=BOTH,expand=True) # 尺寸跟随窗体一起变化
 
la1=Label(pw1,text='窗口1',bg='lightblue') # 标签父组件为pw1
la2=Label(pw1,text='窗口2',bg='lightgreen') # 标签父组件为pw1
 
pw1.add(la1) # 加入标签1
pw1.add(la2) # 加入标签2
 
root.mainloop()

2,创建两个纵向切割的窗口

from tkinter import *
 
root=Tk()
root.geometry('300x300')

pw1=PanedWindow(root,orient=VERTICAL,bg='red') # 创建纵向分割面板,背景红色
pw1.pack(fill=BOTH,expand=True) # 尺寸跟随窗体一起变化
 
la1=Label(pw1,text='横向窗口1',bg='lightblue') 
 
pw1.add(la1) # 加入标签1
 
pw2=PanedWindow(pw1,orient=HORIZONTAL,bg='blue',bd=4) # 创建横向分割面板

la3=Label(pw2,text='纵向窗口1',bg='yellow') # 标签父组件为pw2
la4=Label(pw2,text='纵向窗口2',bg='orange') # 标签父组件为pw2
 
pw1.add(pw2) # pw2加入到pw1
pw2.add(la3) # pw2加入标签3
pw2.add(la4) # pw2加入标签4
 
root.mainloop()

3, 切割窗口中加Frame组件

from tkinter import *
 
root=Tk()
root.geometry('800x500')

pw1=PanedWindow(root,orient=VERTICAL,sashrelief='sunken') # 创建纵向分割面板,背景红色
pw1.pack(fill=BOTH,expand=True) # 尺寸跟随窗体一起变化
 
funcSelectFrame = Frame(pw1)
var = IntVar()
Label(funcSelectFrame, text='功 能 选 择:').place(relx = 0.25,rely = 0.2)
Radiobutton(funcSelectFrame, text="上海", fg='red',variable=var, value=0).place(relx = 0.4,rely = 0.2)
Radiobutton(funcSelectFrame, text="南京", fg='blue',variable=var, value=1).place(relx = 0.5,rely = 0.2)
Radiobutton(funcSelectFrame, text="黄梅", fg='green',variable=var, value=2).place(relx = 0.6,rely = 0.2)
 
pw2=PanedWindow(pw1,orient=HORIZONTAL,sashrelief='sunken') # 创建横向分割面板

la3=Label(pw2,text='纵向窗口1') # 标签父组件为pw2
la4=Label(pw2,text='纵向窗口2') # 标签父组件为pw2

pw1.add(funcSelectFrame,minsize=100)
pw1.add(pw2) # pw2加入到pw1
pw2.add(la3) # pw2加入标签3
pw2.add(la4) # pw2加入标签4
 
root.mainloop()

 

 

        加入sashrelief参数就显示出分割线了。如果你还想花哨点,可以为分割线加入一个小手柄,在创建分割线时,加入参数 showhandle=True。

        如果我们希望标签的最小尺寸不能小于某一个值,可以在标签add加入funcSelectFrame时,加入参数minsize=60 单位是像素

4,切割窗口中加Text组件并带XY滚动条

from tkinter import *
 
root=Tk()
root.geometry('800x500')

pw1=PanedWindow(root,orient=VERTICAL,sashrelief='sunken') # 创建纵向分割面板,背景红色
pw1.pack(fill=BOTH,expand=True) # 尺寸跟随窗体一起变化
 
funcSelectFrame = Frame(pw1)
var = IntVar()
Label(funcSelectFrame, text='功 能 选 择:').place(relx = 0.25,rely = 0.2)
Radiobutton(funcSelectFrame, text="南京", fg='red',variable=var, value=0).place(relx = 0.4,rely = 0.2)
Radiobutton(funcSelectFrame, text="上海", fg='blue',variable=var, value=1).place(relx = 0.5,rely = 0.2)
Radiobutton(funcSelectFrame, text="黄梅", fg='green',variable=var, value=2).place(relx = 0.6,rely = 0.2)
 
showInfo=PanedWindow(pw1,orient=HORIZONTAL,sashrelief='sunken') # 创建横向分割面板

showInfoLabel = Label(showInfo,text=' 信息提示 ',width=20)
showInfoFrame = Frame(showInfo)
showInfoText = Text(showInfoFrame,wrap="none")#wrap="char"

showInfoScH = Scrollbar(showInfoFrame,orient=HORIZONTAL,command=showInfoText.xview)
showInfoScV = Scrollbar(showInfoFrame,command=showInfoText.yview)
showInfoScH.pack(side=BOTTOM,fill=X)
showInfoScV.pack(side=RIGHT,fill=Y)
showInfoText.pack(side=LEFT,fill=BOTH,expand=True)
showInfoText.config(xscrollcommand=showInfoScH.set,yscrollcommand=showInfoScV.set)
showInfo.add(showInfoLabel)
showInfo.add(showInfoFrame)

pw1.add(funcSelectFrame,minsize=100)
pw1.add(showInfo) # pw2加入到pw1

 
root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/931609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手把手教你搭建一个盲盒小程序,轻松掌握开发技巧

在当今社交媒体时代,微信公众号已成为企业、个人传播和推广的重要工具。而微信公众号盲盒小程序则是一个更为创新和互动的方式,能够吸引更多用户的关注和参与。下面,我们将为大家介绍一下微信公众号盲盒小程序的制作完全攻略。 1. 注册登录【…

区分什么是Java内存模型(JMM)和 JVM运行时数据区

文章目录 一、概念区分1、什么是内存模型?什么是(内存区域)运行时数据区?2、为什么要有Java内存模型?2.1、硬件的效率与一致性2.2、 CPU和缓存的一致性2.2.1、为什么需要CPU cache?2.2.2、三级缓存&#xf…

ASEMI快恢复二极管APT80DQ60BG特点应用

编辑-Z APT80DQ60BG参数描述: 型号:APT80DQ60BG 最大峰值反向电压(VRRM):600V 最大直流阻断电压VR(DC):600V 平均整流正向电流(IF):80A 非重复峰值浪涌电流(IFSM):600A 工作接点温度和储存温度(TJ, …

基于社会群体算法优化的BP神经网络(预测应用) - 附代码

基于社会群体算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于社会群体算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.社会群体优化BP神经网络2.1 BP神经网络参数设置2.2 社会群体算法应用 4.测试结果:5…

C#_特性反射详解

特性是什么? 为程序元素额外添加声明信息的一种方式。 字面理解:相当于把额外信息写在干胶标签上,然后将其贴在程序集上。 反射是什么? 反射是一种能力,运行时获取程序集中的元数据。 字面理解:程序运行…

入门必看!亚马逊新品上架如何快速提升产品排名?

对于有经验的亚马逊卖家来说,各种套路已经玩的出神入化,但对于新手卖家来说,可能并不清楚亚马逊新品上架时应该去冲产品排名,更不知道怎么提升产品排名。所以今天,大白就为亚马逊新手卖家带来了亚马逊新品上架该如何提…

VR/AR/眼镜投屏充电方案(LDR6020)

VR眼镜即VR头显,也称虚拟现实头戴式显示设备,随着元宇宙概念的传播,VR眼镜的热度一直只增不减,但是头戴设备的续航一直被人诟病,如果增大电池就会让头显变得笨重影响体验,所以目前最佳的解决方案还是使用VR…

富士施乐S1810 放大或缩小复印方法

1、放置原稿 将原稿放置在稿台玻璃上。(A3纸横向平铺) 2、设置原稿尺寸 按下“原稿尺寸”键,将显示区调整为横向A3,如图: (请务必确认是否与外观图的原稿尺寸显示区所显示的原稿尺寸和方向匹配。&#xf…

直播小程序源码有用的协议知识:MQTT协议

MQTT协议分析: MQTT协议中文全称为消息队列遥测传输协议,是一种实时通信协议,适用于物联网场景中。MQTT协议被应用到直播小程序源码平台中,确保了直播小程序源码平台音视频流的传输高效、低延迟,为直播小程序源码平台…

Springboot_Redis

Springboot默认使用lettuce操作redis,底层是netty jdeis并发差些 Redis的Template 分为两种, 一种是StringRedisTemplate,另一种是RedisTemplate 根据不同的数据类型,大致的操作也分为这5种,以StringRedisTemplate为例 stringRedisTempla…

Linux 终端命令之文件目录操作,对比Dos相关命令

目录 前言 基础命令(文件目录相关的) cd命令 【英文帮助】 【对应Dos命令】 pwd命令 【英文帮助】 【对应Dos命令】 ls命令 【英文帮助】 【对应Dos命令】 tree命令 【英文帮助】 【对应Dos命令】 mkdir命令 【英文帮助】 【对应Dos命令…

Linux下的Shell基础——文本处理工具(五)

前言: Linux Shell是一种基本功,由于怪异的语法加之较差的可读性,通常被Python等脚本代替。既然是基本功,那就需要掌握,毕竟学习Shell脚本的过程中,还是能了解到很多Linux系统的内容。 Linux脚本大师不是…

Android View动画之LayoutAnimation的使用

接前篇 Android View动画整理 ,本篇介绍 LayoutAnimation 的使用。 参考《安卓开发艺术探索》。 View 动画作用于 View 。 LayoutAnimation 则作用于 ViewGroup , 为 ViewGoup 指定一个动画,ViewGoup 的子 View 出场时就具体动画效果。 简言…

YOLO目标检测——真实和人工智能生成的合成图像数据集下载分享

YOLO真实和人工智能生成的合成图像数据集,真实场景的高质量图片数据,图片格式为jpg,数据场景丰富。可用于检测图像是真实的还是由人工智能生成。 数据集点击下载:YOLO真实和人工智能生成的合成图像数据集120000图片数据说明.rar

【MYSQL8.0从入门到精通】

文章目录 MySQL 8.0一.MySQL的多表操作1.外键约束(一对多)2.外键约束(多对多) MySQL 8.0 一.MySQL的多表操作 1.外键约束(一对多) 方式1 在创建表的同时创建外键约束 -- 1.创建主表 create table if no…

聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化

聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化 目录 聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化,聚类结果可视化,MATLAB程…

【GAMES 101】图形学入门——向量与变换(Vector Transform)

一、向量(Vector) 点乘(Dot Product) 定义:计算两个单位向量的夹角用途: 描述两个向量是否足够接近 叉乘(Cross Product) 定义:用于判断法向量的防线,一…

C语言:指针和数组(看完拿捏指针和数组)

目录 数组名的理解: 一维数组: 解析: 字符数组: 解析: 解析: 字符串数组: 解析: 解析: 一级指针: 解析: 解析: 二维数组&a…

minion在ubuntu上的搭建步骤

在Ubuntu上搭建MinIO可以按照以下步骤进行: 下载MinIO服务器二进制文件: 通过浏览器访问 https://min.io/download 或使用以下命令获取最新的MinIO二进制文件:wget https://dl.min.io/server/minio/release/linux-amd64/minio赋予二进制文件…

顺序表之初

欢迎来到我的:世界 希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 ! 目录 线性表简介顺序表定义动态顺序表的初始化尾插头插Cheak 判断是否增容尾删:头删:打印在pos位置前插入x删除pos位置的值查…