python Tkinter的简单入门教程


Posted in Python onApril 11, 2021

我们将编写一个英尺和米的转换程序,通过这个程序,我们将会了解一个真正的实用程序该怎么设计和编写,我们也将会了解到 Tk 程序内部的基本样子。不必完全掌握里面的所有知识,更多细节将会在之后的章节中讲到。本节仅要求了解即可,使读者明白如何设计和编写一个 Tk GUI 程序。

设计

我们将要写一个简单的将英尺(feet)转换为米(me­ters)的 GUI 工具,按照我们的经验,它应该长成下面那个样子:

python Tkinter的简单入门教程

这个程序会有一个输入框用来输入英尺数,还将会有一个显示框用来显示被转换之后的数字,几个用于显示提示字符的文本区域,同样重要的是,必须有一个转换触发按钮。

不难发现,这个程序大致被分为了三行三列,这很重要,关乎之后的 几何管理(用于控制组件的大小和位置),我们将在之后章节中讲到。

代码

from tkinter import *
from tkinter import ttk

def calculate(*args):
    try:
        value = float(feet.get())
        meters.set((0.3048 * value * 10000.0 + 0.5)/10000.0)
    except ValueError:
        pass

root = Tk()
root.title("Feet to Meters")
mainframe = ttk.Frame(root, padding="3 3 15 15")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

feet = StringVar()
meters = StringVar()

feet_entry = ttk.Entry(mainframe, width=7, textvariable=feet)
feet_entry.grid(column=2, row=1, sticky=(W, E))

ttk.Label(mainframe, textvariable=meters).grid(column=2, row=2, sticky=(W, E))
ttk.Button(mainframe, text="转换", command=calculate).grid(column=3, row=3, sticky=W)

ttk.Label(mainframe, text="英尺").grid(column=3, row=1, sticky=W)
ttk.Label(mainframe, text="等于").grid(column=1, row=2, sticky=E)
ttk.Label(mainframe, text="米").grid(column=3, row=2, sticky=W)

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)

feet_entry.focus()
root.bind('<Return>', calculate)

root.mainloop()

最终会是这个样子

python Tkinter的简单入门教程

逐步解释

我们要编写 Tk 程序,首先要引入 Tk­in­ter 的模块。

from tkinter import *
from tkinter import ttk

这两行告诉 Python 我们的程序需要这两个模块。首先,tkinter 是 Tk 的标准包,当它加载的时候,也会导致 Tk 函数库在你的系统中被加载。其次,ttk 是 在 Tk 8.5 中新添加的,提供对 Tk 8.5 中引入的 Tk 主题小部件集的访问,其基本思想是将实现小部件行为的代码与实现其外观的代码尽可能地分开,在这里我们不去深究。

值得注意的是,我们已经从 tk­in­ter 模块中导入了所有函数,因此我们可以直接调用 tk­in­ter 的所有函数而不需要添加前缀。但是我们只导入了 ttk 模块,所以在使用 ttk 模块中的函数时应该增加 ttk 前缀。

如果你要将旧代码修改为新代码,你会发现 Tk­in­ter 的名字从大写变成了小写 tkinter,这个改变从 Python 3.0 开始。

root = Tk()
root.title("Feet to Meters")
mainframe = ttk.Frame(root, padding="3 3 15 15")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

cal­cu­late 函数将会在后面讲解,之所以放到前面,是因为后面的许多语句需要调用它。

root = Tk() 语句构建了一个 main 窗口,也被称为 root 窗口。使用 root.title("title") 为窗口赋予一个名字。ttk.Frame(root, padding="3 3 15 15") 建立一个框架,这个框架分为三行三列,像素为 15。我们将这个框架放置到到 root 窗口中,不同的是,我们的所有组件都被放到了这个框架中而不是 root 窗口。

一般来说,我们可以将所有的组件(Wid­get)都放到 root 窗口中,但是主窗口的背景可能与我们添加的组件不匹配,这时候,我们添加一个中间框架(Frame),将组件放到这个中间框架上来保证内容与背景的匹配。

columncoonfigure 和 rowconfigure 告诉 Tk, 当主窗口重新改变了大小,那么在这之上的 Frame 框架也应该变化,以占用多余的空间。

feet = StringVar()
meters = StringVar()
feet_entry = ttk.Entry(mainframe, width=7, textvariable=feet)
feet_entry.grid(column=2, row=1, sticky=(W, E))

ttk.Label(mainframe, textvariable=meters).grid(column=2, row=2, sticky=(W, E))
ttk.Button(mainframe, text="转换", command=calculate).grid(column=3, row=3, sticky=W)

上面的几条语句在框架上 (main­frame) 创建了三个组件,输入框、输出区域(La­bel,用于放置转换的结果)、转换按钮。

对于每一个组件(Wid­get),我们需要做两件事:

  1. 创建
  2. 放置

他们都是 ttk 模块中的类。创建时,我们指定传入的参数:放置的框架,大小,按钮中的字符等。至于 textvariable 的意思,它指这个输入框或者输出框中的值所关联的变量,而这个变量的类型是 StringVar 的对象。

我们使用 grid(网格) 进行几何管理,意思就是这个组件将放在哪一个地方(哪一行,哪一列),sticky 指明组件在分配给它的网格单元(grid cell)中的排列(line up)方式,E、W、S、N 就是东西南北的意思,类似于文本编辑器中的 居中、靠左、靠右等。

ttk.Label(mainframe, text="英尺").grid(column=3, row=1, sticky=W)
ttk.Label(mainframe, text="等于").grid(column=1, row=2, sticky=E)
ttk.Label(mainframe, text="米").grid(column=3, row=2, sticky=W)

上述三行创建了三个指定内容的 文本标签(La­bel),并放到了指定的位置。

for child in mainframe.winfo_children():
    child.grid_configure(padx=5, pady=5)
feet_entry.focus()
root.bind('<Return>', calculate)

这四行代码为我们的图形化做了一个漂亮的收尾工作。

前两行代码遍历所有的放置在 main­frame 中的组件,并在它们周围增加了一些边框,使它们不至于都挤在一起。当然也可以单独遍历这些组件,然后逐个进行设置,但这不是方便的做法。

第三行代码告诉 Tk,在程序运行时,将光标聚焦在输入框中,使用户不必再点击一下输入框。

第四行代码告诉 Tk,当用户在按下 Return(Win­dows 中是 En­ter)时,调用 cal­cu­late 函数。这与按下按钮调用 cal­cu­late 函数是一样的。

def calculate(*args):
    try:
        value = float(feet.get())
        meters.set((0.3048 * value * 10000.0 + 0.5)/10000.0)
    except ValueError:
        pass

这里我们定义了一个 cal­cu­late 函数调用,当按下 Return、Enter(Win­dows),或者转换按钮时它将会被调用。它从输入框中获取用户输入的数值,然后将其转换为单位为米的数值之后,将输入框中的数值设置为正确的结果。

显然看到,cal­cu­late 函数通过获取 feet 和设置 meters 来改变在它们各自对应的输入框(Entry)和输出框(Label)中的数值显示。当用户的输入改变时,对应的 feet 的值就会被修改为对应的输入值;当 meters 被被修改时,对应的输出框(La­bel)显示的值也会改变。这就是在定义 feet_entry(输入框)和 label(输出框)时,还要指定 textvariable 的值的原因,而它的值应该是一个 StringVar 的对象。如以下示例:

feet = StringVar()
meters = StringVar()
feet_entry = ttk.Entry(mainframe, width=7, textvariable=feet)
ttk.Label(mainframe, textvariable=meters).grid(column=2, row=2, sticky=(W, E))
root.mainloop()

最后一句告诉 Tk 进入事件循环(event loop),这是使一些运行起来所必须的。

以上就是python Tkinter的简单入门教程的详细内容,更多关于python Tkinter入门教程的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python显示天气预报
Mar 02 Python
使用grappelli为django admin后台添加模板
Nov 18 Python
全面解析Python的While循环语句的使用方法
Oct 13 Python
一张图带我们入门Python基础教程
Feb 05 Python
python 地图经纬度转换、纠偏的实例代码
Aug 06 Python
Python绘制堆叠柱状图的实例
Jul 09 Python
Pytorch Tensor的统计属性实例讲解
Dec 30 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
OpenCV+python实现实时目标检测功能
Jun 24 Python
Jmeter HTTPS接口测试证书导入过程图解
Jul 22 Python
Django正则URL匹配实现流程解析
Nov 13 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
Nov 27 Python
PyQt5 显示超清高分辨率图片的方法
用Python提取PDF表格的方法
用Python提取PDF表格的方法
python实现自动化群控的步骤
Apr 11 #Python
python 调用js的四种方式
Apr 11 #Python
Python WSGI 规范简介
使用pytorch实现线性回归
You might like
认识并使用PHP超级全局变量
2010/01/26 PHP
php生成图片缩略图的方法
2015/04/07 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
加载 Javascript 最佳实践
2011/10/30 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
纯JS实现本地图片预览的方法
2015/07/31 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
vue实现登录拦截
2020/06/29 Javascript
Element Notification通知的实现示例
2020/07/27 Javascript
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
[02:53]2018年度DOTA2最佳战队-完美盛典
2018/12/17 DOTA
Python 面向对象 成员的访问约束
2008/12/23 Python
HTML中使用python屏蔽一些基本功能的方法
2017/07/07 Python
python 调用c语言函数的方法
2017/09/29 Python
python实现连续图文识别
2018/12/18 Python
Python 常用模块 re 使用方法详解
2019/06/06 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
解决python replace函数替换无效问题
2020/01/18 Python
什么是Python变量作用域
2020/06/03 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
查看keras的默认backend实现方式
2020/06/19 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
BRASTY捷克:购买香水、化妆品、手袋和手表
2017/07/12 全球购物
新西兰珠宝品牌:Michael Hill
2017/09/16 全球购物
Stokke美国官方网店:高级儿童家具、推车、汽车座椅和配件
2020/06/06 全球购物
亿阳信通股份有限公司笔试题(C#)
2016/03/04 面试题
简历自我评价怎么写好呢?
2014/01/04 职场文书
教师演讲稿范文
2014/01/08 职场文书
新闻发布会主持词
2014/03/28 职场文书
Python import模块的缓存问题解决方案
2021/06/02 Python
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang