以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/B1hH5Qzd2RkAiiUId1tLWw
(资料图片仅供参考)
本文大概 2874 个字,阅读需花 10 分钟内容不多,但也花了一些精力如要交流,欢迎关注我然后评论区留言
进入正文之前先说一件小事,本公众号已改名为【ENG八戒】,原名是【englyf】。改名的理由是什么?以后会告诉朋友们的!
这篇文章属于系列文章《Python 内置界面开发框架 Tkinter入门篇》的第三篇,上接《Python 内置界面开发框架 Tkinter入门篇乙》,欢迎关注我的微信公众号「ENG八戒」查看这个系列相关文章。
界面布局
关于 Tkinter 框架的 GUI 布局,其实官方没有提供对应的图形化工具可用,但是网上有一些开源的小工具可以使用。这里不打算介绍这些小工具的使用,而是直接用框架提供的几何图形管理器来布局,比如上面提到过的 pack() 就是其中一种。这里提到的几何图形管理器也就是其它框架里常说的布局管理器。
Tkinter 框架提供的布局管理器有:pack、grid、place 三种。每一个控件只可以使用一种布局管理器,不同控件使用的布局管理器可以不一样。
pack
形象点说, pack 就是把控件包装在一个矩形区域,这个区域大小足够放置控件,而且默认置中。pack 是最简单的布局管理器,也称之为包装布局。
直接试一试用 pack 来布局三个静态标签 Label,默认设置(pack() 传入参数为空)
import tkinter as tkwindow = tk.Tk()lbl_1 = tk.Label( master=window, text="label 1", fg="black", bg="red", width=10, height=5 )lbl_1.pack()lbl_2 = tk.Label( master=window, text="label 2", fg="black", bg="yellow", width=10, height=5 )lbl_2.pack()lbl_3 = tk.Label( master=window, text="label 3", fg="black", bg="blue", width=10, height=5 )lbl_3.pack()window.mainloop()
看看显示效果
可以看到,默认 pack 会在父窗口 window 中垂直方向按顺序包装排列这三个静态标签 Label。
那么,如果我需要让这几个标签水平排列呢?可以这样子改
lbl_1.pack(side=tk.LEFT)...lbl_2.pack(side=tk.LEFT)...lbl_3.pack(side=tk.LEFT)
看看显示效果
pack(side=tk.TOP) 和默认设置等价。
简单汇总介绍一下其它的参数
参数 | 赋值 | 说明 |
---|---|---|
after | 控件 widget | 将此控件包装在控件 widget 后边 |
anchor | NSEW (or subset) | 根据方向定位此控件,NSEW 表示北南东西四个方向 |
before | 控件 widget | 将此控件包装在控件 widget 前边 |
expand | bool 类型值 | 跟着父控件一起伸缩 |
fill | NONE、X、Y、BOTH | 选择当控件伸缩时按照哪个方向填充 |
ipadx | amount | 在x方向添加内部填充 |
ipady | amount | 在y方向添加内部填充 |
padx | amount | 在x方向添加填充 |
pady | amount | 在y方向添加填充 |
side | TOP、BOTTOM、LEFT、RIGHT | 把控件往哪边添加 |
很多时候开发界面都需要让里边的控件跟随窗口自动拉伸大小,来看一下上面的代码应该怎么改
lbl_1.pack(fill=tk.BOTH, expand=tk.TRUE)...lbl_2.pack(fill=tk.BOTH, expand=tk.TRUE)...lbl_3.pack(fill=tk.BOTH, expand=tk.TRUE)
启动的时候,还没有拉伸窗口
然后拉伸看看
grid
如名字表述,grid 会把父窗口划分成行列,然后根据调用时传入参数 row,column 确定把控件放置在对应的行列中。grid 也称之为格子布局。
还是以静态标签为例,创建 3x3 的矩阵标签。为了凸显各个标签的边界,这里还需要添加 Frame 控件,每个标签放置于单独的 Frame 中。
import tkinter as tkwindow = tk.Tk()for i in range(3): for j in range(3): frame = tk.Frame( master=window, relief=tk.RAISED, borderwidth=1 ) frame.grid(row=i, column=j) label = tk.Label( master=frame, text=f"Row {i}\nColumn {j}" ) label.pack()window.mainloop()
可以看到,上面这个例子布局时,只有 Frame 才需要应用 grid 管理器,因为每个标签和 Frame 一一对应,所以标签不需要重复应用格子布局。
看看显示效果
简单汇总介绍一下其它的参数
参数 | 赋值 | 说明 |
---|---|---|
column | 列序号 | 指定放置的列,从0开始 |
columnspan | 列数 | 放置的控件横跨多少列 |
ipadx | amount | 在 x 方向添加内部填充 |
ipady | amount | 在 y 方向添加内部填充 |
padx | amount | 在 x 方向添加外部填充 |
pady | amount | 在 y 方向添加外部填充 |
row | 行序号 | 指定放置的行,从0开始 |
rowspan | number | 放置的控件横跨多少行 |
sticky | NSEW | 如果单元格比较大,那么控件的指定边界将贴着单元格。NSEW分别对应顶部、底部、右边、左边边界 |
细心的朋友会发现,一旦拉伸上面的那个矩阵标签窗口,窗口界面就会露出部分底面,矩阵标签没有跟随一起拉伸。
这样明显和我们的预期不符合,这个问题怎么解决呢?
可以调用父窗口的 columnconfigure() 和 rowconfigure() 方法配置各列和行的伸缩比。这两个方法都有三个输入参数,看下面的表格
参数 | 说明 |
---|---|
index | 序号,指定特定的行或列,可以是单个行列序号值,也可以是代表多个行或列的列表 |
weight | 伸缩权重 |
minsize | 最小宽度值 |
现在来看看怎么改,才能让矩阵标签跟随父窗口一起拉伸?
import tkinter as tkwindow = tk.Tk()for i in range(3): window.rowconfigure(i, weight=1) window.columnconfigure(i, weight=1) for j in range(3): frame = tk.Frame( master=window, relief=tk.RAISED, borderwidth=1 ) frame.grid(row=i, column=j) label = tk.Label( master=frame, text=f"Row {i}\nColumn {j}" ) label.pack()window.mainloop()
看看拉伸之后的显示效果
perfect!另外需要提一下,grid 具有 pack 能做的所有功能,但是使用的形式更简单,因此应该作为更优先的布局管理器。
place
place 用于对控件精确定位的场合。使用的时候需要传入参数 x 和 y 分别用于指定控件的放置位置坐标值 x 和 y,传入的 x 和 y 是基于父控件的左上角为原点的坐标系,单位是像素点。
大多数界面应用里,控件都不需要精确的定位。但是某些,比如地图应用里,就的确需要对元素的精确定位了。
下面举个栗子,在窗口里不同位置放置各一个标签
import tkinter as tkwindow = tk.Tk()label1 = tk.Label( master=window, text="place (0, 0)", bg="yellow" )label1.place(x=0, y=0)label2 = tk.Label( master=window, text="place (40, 40)", bg="blue" )label2.place(x=40, y=40)window.mainloop()
看看上面代码的显示效果
说回来,place 的参数xy单位是像素,那么在不同的系统下,字体类型和大小都是不同的,那么被放置的控件就有可能超出窗口边界。因此 place 真的不常用,关于 place 进一步的信息就不再展开了。
交互
上面介绍的内容都仅限于 Tkinter 界面的可视化设计,那么现在是时候介绍一下Tkinter 界面和用户的互动了。
比如,Tkinter 界面对于事件的响应是怎么发生的?
一般,在 Tkinter 中通过预先绑定事件和响应处理函数,每当事件发生时,主窗口的 mainloop 就会收到事件,然后根据绑定信息,查找到响应处理函数并调用,来达到交互的效果。绑定的通用方法是调用各个控件的 bind()。
比如,下面我们来实现一个简单的键盘响应互动,每次按键按下时就把对应的按键打印出来
import tkinter as tkdef handle_keypress(event): print(event.char)window = tk.Tk()window.bind("", handle_keypress)window.mainloop()
上面的代码没有添加额外的控件,除了有个空白的主窗口。其中,对主窗口 window 绑定了按键事件 Key 和处理函数 handle_keypress。
调用 bind() 最少要求输入两个参数,一个是形式为 "
定义处理函数 handle_keypress 时,唯一做的事情是把传入的事件字符打印到标准终端。
每当按下键盘的按键,命令行终端就会输出对应的按键。
但是,对于按钮 Button 来说,点击事件的触发处理可以不需要使用 bind(),仅需要在实例化控件 Button 时,传入处理函数给 command 参数即可,初始化过程会自动绑定 click 事件的响应。
上代码看看
import tkinter as tkdef handle_keypress(): print("clicked")window = tk.Tk()button = tk.Button( master=window, text="click me!", command=handle_keypress )button.pack()window.mainloop()
运行程序
用鼠标点击一下界面上的按钮,发现终端会输出字符串 clicked
由于篇幅受限,本系列教程还未完结,下一篇《Python 内置界面开发框架 Tkinter入门篇 丁》将在本公众号稍后推送
X 关闭
推荐内容
精彩推荐
-
Python 内置界面开发框架 Tkinter入门篇 丙2023-02-23
-
商家狡辩没缺斤短两:0.35kg是700g 具体详细内容是什么2023-02-22
-
兔年加速跑!永泰这个产业园建设“进度条”刷新_世界报道2023-02-22
-
微信支付密码怎么找回2023-02-22
-
天天快资讯丨百达精工: 百达精工关于“百达转债”预计满足赎回条件的提示性公告2023-02-22
-
雄安新区农行推出“连心贷”,未婚男女朋友为共同还款人2023-02-22
-
小浣熊干脆面_说一说小浣熊干脆面的简介2023-02-22
-
资讯推荐:制作小游戏怎么赚钱_制作小游戏2023-02-22
-
近六成博士后出站后留汉创新创业,“最强大脑”聚汉为高质量发展蓄势赋能2023-02-22
-
147期双色球预测号_147台球2023-02-22
-
安康新华电脑学校2023-02-21
-
环球聚焦:衡水到北京火车站时刻表_衡水到北京火车时刻表2023-02-21
-
【世界播资讯】TCL科技:公司与产业链上下游伙伴始终保持紧密的合作关系2023-02-21
-
慧为智能(832876)2月21日游资资金净卖出17.58万元2023-02-21
-
白色紧身牛仔裤,搭配白色板鞋,显年轻又休闲的穿搭2023-02-21
-
百体2023-02-21
-
环球热文:脱不花_说一说脱不花的简介2023-02-21
-
世界简讯:欧盟委员会提议从明年起实施1年的天然气价格上限,各成员国产生分歧2023-02-21
-
最新消息:脚扭伤了怎么治疗_扭伤脚踝怎么处理2023-02-21
-
38岁《小龙人》主演去世,前天刚和好友喝酒,死因曝光引争议?2023-02-21
-
深圳驾考“新规”站岗执勤才能约考?车管所回应:谣言!2023-02-20
-
棒棒糖文案简短_棒棒糖的含义2023-02-20
-
全球今日报丨如何设置vivo手机的护眼模式2023-02-20
-
伊春消防:“问诊”“九小场所”隐患,零距离检查指导2023-02-20
-
今日播报!拉布拉多警长_拉布2023-02-20
-
每日速讯:长顺:开展农资打假行动 保障春耕不误农时2023-02-20
-
焦点快看:汽车产品3c认证实施细则_汽车3c认证是什么?2023-02-20
-
环球热资讯!权益多头产品回暖,产品销售依然分化明显2023-02-20
-
环球快消息!梦幻西游符石耐久_梦幻西游符石2023-02-20
-
郓城北二环,在哪!回复了…2023-02-19
-
天天微资讯!北京抽检查获不达标玻尿酸2489支2023-02-19
-
观速讯丨花垣县弘承汽车租赁有限责任公司2023-02-19
-
“90后”女生在厦门守护“飞机心脏”2023-02-19
-
天天最新:dnf熟练度有什么用吗_dnf熟练度有什么用2023-02-19
-
屈楚萧事件是真的吗_达洛夫事件真的假的2023-02-19
-
天天热资讯!南靖县奎洋镇:线上线下联动打好人才政策宣传“组合拳”2023-02-19
-
全球连线 | 苦尽甘来!中企公益项目让巴西原住民喝上汩汩清泉2023-02-18
-
全球速讯:张颂文新电影官宣定档,可电影海报却引起争议,谁红谁能当一番吗2023-02-18
-
全面注册制对上市公司要求有哪些变化?一文解读2023-02-18
-
全球播报:dnf没有异次元属性怎么赋予_dnf异次元属性怎么赋予2023-02-18
-
热文:2022年度个税汇算预约办税“三步走”2023-02-18
-
天天速读:华润三九02月17日被深股通减持121.93万股2023-02-18
-
一加手机质量怎么样_一汽威志质量怎么样?2023-02-17
-
122名博士“组团”进海南乡村了!2023-02-17
-
每日观察!弹跳鞋加盟_弹跳鞋2023-02-17
-
看点:腿粗的女生少穿紧身裤!试试这些穿法,显瘦还时髦2023-02-17
-
美总统竞选人黑莉:中国虽是美史上最强对手,但命运会与苏联一样2023-02-17
-
EVTank:预计2023年底全行业将形成13.5GWh钠离子电池专用量产线产能2023-02-17
-
天天短讯!在中国休养一个多月的83岁柬埔寨太后回国!紫裙配花围巾太高贵2023-02-17
-
今日播报!明清时期宋曹草书字幅_对于明清时期宋曹草书字幅简单介绍2023-02-17
-
福睿斯和哈弗h6哪个好_福睿斯哈佛H6宝骏560哪个好2023-02-16
-
焦点热讯:中国农业银行眉县支行家装节特惠活动力促消费升级2023-02-16
-
环球观天下!《三体》漫画面世,刘慈欣:有梦想成真的感觉2023-02-16
-
当前时讯:新东方在线CEO和CFO轮番减持 合计套现近3亿港元2023-02-16
-
环球新消息丨百利科技2月16日盘中跌幅达5%2023-02-16
-
【全球新要闻】无锡拈花湾开车能进景区吗2023-02-16
-
*ST中昌2月16日快速上涨2023-02-16
-
全球即时:深港驾校_关于深港驾校的介绍2023-02-16
-
全球微头条丨机械革命旷世16 PRO Super,水冷骨灰级游戏本,满血4070独显2023-02-16
-
热门看点:朝三暮四打一生肖,是什么?2023-02-16
-
聚焦:明日10点!壹刻宝又要发贵阳文旅消费券了2023-02-16
-
当前视点!吴秀波资料简介_个人简历及图片2023-02-16
-
扬州慢·烟花瘦西湖2023-02-15
-
《我是歌手》第一季的冠军是谁?_我是歌手第一季冠军是谁2023-02-15
-
波音1月客机交付量38架 环比增速大幅下滑2023-02-15
-
流浪法师连招 流浪法师瑞兹技能连招玩法介绍2023-02-15
-
天天热点评!谁看了都夸的103m²现代风装修2023-02-15
-
小米路由器怎么设置 设置步骤2023-02-15
-
【世界快播报】富士莱:NMN不是我公司产品 公司产品与NMN之间无法直接做比较2023-02-15
-
最新:今日办公室布局设计方案_办公室布局设计2023-02-15
-
世界速看:熔炉真实事件曝光 真实情节比电影更让人感到绝望2023-02-15
-
世界热点!欧冠16强攻略:时隔104天,英超半决赛螺旋式下滑,拜仁皇马争冠2023-02-15
-
国金证券:汽车景气度仍然维持高位 市场悲观预期将在今年Q1得到向上修正2023-02-15
-
【世界速看料】全国大部开启升温通道 江南多地周末将迎体验版春天2023-02-15
-
精彩看点:如何用WinPE安装Win7系统2023-02-15
-
【独家】一线 公司鹤哈高速峰岩山隧道项目加快推进工程建设 为龙江大地增添春意2023-02-15
-
每日头条!2020鼠年对联大全_鼠年春节对联精选2023-02-15
-
今日视点:后宫宠妃_后宫宠妃2023-02-15
-
关于美得让人心碎的优美散文5篇2023-02-15
-
天天快报!【推荐】红橙黄三色木棉花争艳,墨江雅邑“花花世界”惊艳初春!2023-02-14
-
囫囵吞枣的近义词2023-02-14
-
全球头条:恢复血小板最好的方法_血小板减少吃什么药效果好2023-02-14
-
世界热点评!大宗交易:三晖电气成交3684.55万元,折价7.09%(02-14)2023-02-14
-
祖国我爱你作文2023-02-14
-
焦点速看:校车着火怎么办?杨浦警方上午“硬核”演练护航上学路2023-02-14
-
今热点:春节送礼一般送什么2023-02-14
-
今日热搜:自我介绍的作文300字2023-02-14
-
梅山湾沙滩公园2023-02-14
-
天才j第二季在线观看_天才j第二季2023-02-14
-
看点:日本央行新行长人选今日正式揭晓 YCC结束可能性上升2023-02-14
-
【全球新要闻】送女孩生日礼物送什么好2023-02-14
-
西藏路_关于西藏路的介绍2023-02-14
-
二两的最新更新视频_二两2023-02-14
-
世界短讯!万圣夜是什么2023-02-14
-
【世界快播报】san值2023-02-13
-
环球视讯!甜能组什么词语2023-02-13
-
当前滚动:织金县三塘镇:多措并举稳就业 “春暖乌蒙”促发展2023-02-13