Python 内置界面开发框架 Tkinter入门篇 丙
来源:腾讯云    时间:2023-02-23 03:14:08

以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「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入门篇 丙
  • 商家狡辩没缺斤短两:0.35kg是700g 具体详细内容是什么
  • 兔年加速跑!永泰这个产业园建设“进度条”刷新_世界报道
  • 微信支付密码怎么找回
  • 天天快资讯丨百达精工: 百达精工关于“百达转债”预计满足赎回条件的提示性公告
  • 雄安新区农行推出“连心贷”,未婚男女朋友为共同还款人
  • 小浣熊干脆面_说一说小浣熊干脆面的简介
  • 焦点速递!中国依然是外商投资兴业的热土——从2023年首月外资成绩单看共享构建新发展格局新机遇
  • 资讯推荐:制作小游戏怎么赚钱_制作小游戏
  • 近六成博士后出站后留汉创新创业,“最强大脑”聚汉为高质量发展蓄势赋能
  • 147期双色球预测号_147台球
  • 安康新华电脑学校
  • 环球聚焦:衡水到北京火车站时刻表_衡水到北京火车时刻表
  • 【世界播资讯】TCL科技:公司与产业链上下游伙伴始终保持紧密的合作关系
  • 慧为智能(832876)2月21日游资资金净卖出17.58万元
  • 白色紧身牛仔裤,搭配白色板鞋,显年轻又休闲的穿搭
  • 百体
  • 环球热文:脱不花_说一说脱不花的简介
  • 世界简讯:欧盟委员会提议从明年起实施1年的天然气价格上限,各成员国产生分歧
  • 最新消息:脚扭伤了怎么治疗_扭伤脚踝怎么处理
  • 38岁《小龙人》主演去世,前天刚和好友喝酒,死因曝光引争议?
  • 深圳驾考“新规”站岗执勤才能约考?车管所回应:谣言!
  • 棒棒糖文案简短_棒棒糖的含义
  • 全球今日报丨如何设置vivo手机的护眼模式
  • 伊春消防:“问诊”“九小场所”隐患,零距离检查指导
  • 今日播报!拉布拉多警长_拉布
  • 每日速讯:长顺:开展农资打假行动 保障春耕不误农时
  • 焦点快看:汽车产品3c认证实施细则_汽车3c认证是什么?
  • 环球热资讯!权益多头产品回暖,产品销售依然分化明显
  • 环球快消息!梦幻西游符石耐久_梦幻西游符石
  • 郓城北二环,在哪!回复了…
  • 天天微资讯!北京抽检查获不达标玻尿酸2489支
  • 观速讯丨花垣县弘承汽车租赁有限责任公司
  • “90后”女生在厦门守护“飞机心脏”
  • 天天最新:dnf熟练度有什么用吗_dnf熟练度有什么用
  • 屈楚萧事件是真的吗_达洛夫事件真的假的
  • 天天热资讯!南靖县奎洋镇:线上线下联动打好人才政策宣传“组合拳”
  • 全球连线 | 苦尽甘来!中企公益项目让巴西原住民喝上汩汩清泉
  • 全球速讯:张颂文新电影官宣定档,可电影海报却引起争议,谁红谁能当一番吗
  • 全面注册制对上市公司要求有哪些变化?一文解读
  • 全球播报:dnf没有异次元属性怎么赋予_dnf异次元属性怎么赋予
  • 热文:2022年度个税汇算预约办税“三步走”
  • 天天速读:华润三九02月17日被深股通减持121.93万股
  • 02月18日00时江苏宿迁昨日累计报告阳性感染者确诊100例 怎么判断自己是否属于轻型感染者
  • 一加手机质量怎么样_一汽威志质量怎么样?
  • 122名博士“组团”进海南乡村了!
  • 每日观察!弹跳鞋加盟_弹跳鞋
  • 看点:腿粗的女生少穿紧身裤!试试这些穿法,显瘦还时髦
  • 美总统竞选人黑莉:中国虽是美史上最强对手,但命运会与苏联一样
  • EVTank:预计2023年底全行业将形成13.5GWh钠离子电池专用量产线产能
  • 天天短讯!在中国休养一个多月的83岁柬埔寨太后回国!紫裙配花围巾太高贵
  • 今日播报!明清时期宋曹草书字幅_对于明清时期宋曹草书字幅简单介绍
  • 福睿斯和哈弗h6哪个好_福睿斯哈佛H6宝骏560哪个好
  • 焦点热讯:中国农业银行眉县支行家装节特惠活动力促消费升级
  • 环球观天下!《三体》漫画面世,刘慈欣:有梦想成真的感觉
  • 当前时讯:新东方在线CEO和CFO轮番减持 合计套现近3亿港元
  • 环球新消息丨百利科技2月16日盘中跌幅达5%
  • 【全球新要闻】无锡拈花湾开车能进景区吗
  • *ST中昌2月16日快速上涨
  • 全球即时:深港驾校_关于深港驾校的介绍
  • 全球微头条丨机械革命旷世16 PRO Super,水冷骨灰级游戏本,满血4070独显
  • 热门看点:朝三暮四打一生肖,是什么?
  • 聚焦:明日10点!壹刻宝又要发贵阳文旅消费券了
  • 当前视点!吴秀波资料简介_个人简历及图片
  • 扬州慢·烟花瘦西湖
  • 《我是歌手》第一季的冠军是谁?_我是歌手第一季冠军是谁
  • 波音1月客机交付量38架 环比增速大幅下滑
  • 流浪法师连招 流浪法师瑞兹技能连招玩法介绍
  • 每日播报!鹿山新材(603051):2022年度业绩快报,营业收入26.18亿元,同比增加54.6%
  • 天天热点评!谁看了都夸的103m²现代风装修
  • 小米路由器怎么设置 设置步骤
  • 【世界快播报】富士莱:NMN不是我公司产品 公司产品与NMN之间无法直接做比较
  • 最新:今日办公室布局设计方案_办公室布局设计
  • 世界速看:熔炉真实事件曝光 真实情节比电影更让人感到绝望
  • 世界热点!欧冠16强攻略:时隔104天,英超半决赛螺旋式下滑,拜仁皇马争冠
  • 国金证券:汽车景气度仍然维持高位 市场悲观预期将在今年Q1得到向上修正
  • 【世界速看料】全国大部开启升温通道 江南多地周末将迎体验版春天
  • 精彩看点:如何用WinPE安装Win7系统
  • 【独家】一线 公司鹤哈高速峰岩山隧道项目加快推进工程建设 为龙江大地增添春意
  • 每日头条!2020鼠年对联大全_鼠年春节对联精选
  • 今日视点:后宫宠妃_后宫宠妃
  • 关于美得让人心碎的优美散文5篇
  • 天天快报!【推荐】红橙黄三色木棉花争艳,墨江雅邑“花花世界”惊艳初春!
  • 囫囵吞枣的近义词
  • 全球头条:恢复血小板最好的方法_血小板减少吃什么药效果好
  • 世界热点评!大宗交易:三晖电气成交3684.55万元,折价7.09%(02-14)
  • 祖国我爱你作文
  • 焦点速看:校车着火怎么办?杨浦警方上午“硬核”演练护航上学路
  • 今热点:春节送礼一般送什么
  • 今日热搜:自我介绍的作文300字
  • 梅山湾沙滩公园
  • 天才j第二季在线观看_天才j第二季
  • 看点:日本央行新行长人选今日正式揭晓 YCC结束可能性上升
  • 【全球新要闻】送女孩生日礼物送什么好
  • 西藏路_关于西藏路的介绍
  • 二两的最新更新视频_二两
  • 世界短讯!万圣夜是什么
  • 【世界快播报】san值
  • 环球视讯!甜能组什么词语
  • 当前滚动:织金县三塘镇:多措并举稳就业 “春暖乌蒙”促发展
  • 精彩推荐

    Copyright ©  2015-2022 太平洋卫浴网版权所有  备案号:豫ICP备2022016495号-17   联系邮箱:93 96 74 66 9@qq.com