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类的定义、继承及类对象使用方法简明教程
May 08 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
Jun 14 Python
Python简单获取自身外网IP的方法
Sep 18 Python
浅谈Python中重载isinstance继承关系的问题
May 04 Python
python pandas生成时间列表
Jun 29 Python
python实现本地批量ping多个IP的方法示例
Aug 07 Python
python 负数取模运算实例
Jun 03 Python
如何解决pycharm调试报错的问题
Aug 06 Python
Python SMTP发送电子邮件的示例
Sep 23 Python
matlab xlabel位置的设置方式
May 21 Python
Python利用机器学习算法实现垃圾邮件的识别
Jun 28 Python
Pandas 稀疏数据结构的实现
Jul 25 Python
PyQt5 显示超清高分辨率图片的方法
用Python提取PDF表格的方法
用Python提取PDF表格的方法
python实现自动化群控的步骤
Apr 11 #Python
python 调用js的四种方式
Apr 11 #Python
Python WSGI 规范简介
使用pytorch实现线性回归
You might like
相对路径转化成绝对路径
2007/04/10 PHP
基于Discuz security.inc.php代码的深入分析
2013/06/03 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
2017/05/04 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
PDO::query讲解
2019/01/29 PHP
thinkPHP5框架路由常用知识点汇总
2019/09/15 PHP
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
javascript闭包的高级使用方法实例
2013/07/04 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
js实现拖拽效果
2015/02/12 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
2016/07/27 Javascript
让DIV的滚动条自动滚动到最底部的3种方法(推荐)
2016/09/24 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
2016/11/25 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
vue-cli3.0 特性解读
2018/04/22 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
2020/05/08 Javascript
python通过zlib实现压缩与解压字符串的方法
2014/11/19 Python
深入理解python函数递归和生成器
2016/06/06 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
汽车工程专业应届生求职信
2013/10/19 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
婚礼新人答谢词
2015/01/04 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
MySQL七大JOIN的具体使用
2022/02/28 MySQL
Spring中bean集合注入的方法详解
2022/07/07 Java/Android