使用Tkinter编写一个简单的窗口应用

文章目录

  • 使用Tkinter编写一个简单的窗口应用
    • 一、前言
    • 二、控件简介
    • 三、实践学习
      • 1. 主窗口的创建以及Label的使用
      • 2. Button的创建使用
      • 3. pack方法和grid方法以及Text和Entry的应用
      • 4. 使用Frame对窗口进行空间规划
      • 5. 使用Pyinstaller对程序进行打包

一、前言

​ Tkinter是python中的一个实现可视化窗口的模块,具有使用方便(Python自带、无需下载)、易于上手的优势,足以应付小型应用的开发。
​ 使用Tkinter,就像搭积木一样能将一个个控件(标签、输入框、文本框、按钮等)放置到合适的位置,并赋予它们功能,建立一个简单的窗口应用。
​ 本文章的目的是让小白也能学会使用Python中的Tkinter模块编写一个简单的窗口应用,具有一定的实操性,推荐读者跟着打一下代码。
​ 读完本文章你将学会:使用Frame规划窗口布局,能够大概将Label(标签)、Button(按钮)、Entry(输入框)、Text(文本框)通过pack、grid方法放到所需位置,能够通过按钮实现交互(调用函数),读取输入框中的内容,经过函数处理后在文本框输出,编写一个类似下图的窗口应用,以及如何通过Pyinstaller将py程序打包为exe程序。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nmTmlLpB-1601092903845)(D:\林淼\笔记\Blog\Tkinter实例.png)]
​ 更多相关内容的使用,如Canvas、Menu等,本文章将不会介绍,因为使用以上的内容已经足以搭建一个小型的应用了,以后将会考虑继续更新后面的内容。
​ 另外,本文章使用Python3.8.5版本进行讲解,与老版本的Tkinter模块的使用存在部分差异,推荐读者使用Python3.8.5及以上版本进行学习。

二、控件简介

  • Label: 标签,显示一个文本或图像
  • Entry: 输入框,程序能从中获取输入内容
  • Button: 按钮,通过连接函数来执行一个操作
  • Text: 文本框,可以显示程序输出,支持样式设定
  • Frame: 框架控件,在屏幕上显示一个矩形区域,多用来作为容器

三、实践学习

1. 主窗口的创建以及Label的使用

# 导入Tkinter模块,使用别名tk
import tkinter as tk# 使用Tk方法创建一个窗口,注意是大写T
window = tk.Tk()
# 给窗口起一个标题
window.title('Tkinter is awesome')
# 设定窗口大小(长x宽,这里是使用字符'x'而不是星号*)
window.geometry('300x500')# 创建label控件
label = tk.Label(window, text='Hello! Tkinter.', bg='black', fg='white', font=('Consolas', 12), width=30, height=2)
# 这里使用的是键值对(即属性: 值)的方式来设定参数,window表示该标签放置在window上,text为显示文本,bg(background)为背景颜色,fg(fontground)为字体颜色,font=(字体, 字号),width和height表示该标签的宽和高(如height为2表示该标签有2个字符那么高,这与字号的设定相关)# 将label放置
label.pack()# 主窗口循环显示
window.mainloop()
# 这一行代码将不断刷新窗口,所有的窗口文件都必须有这一命令,如果没有这一命令窗口将不会显示

测试效果

2. Button的创建使用

# 导入tkinter模块
import tkinter as tkclicked = False
def Clicked():global clicked# 点一次,显示Label显示文本if clicked == False:clicked = Truevar.set('You have clicked it!')# 再点一次,清除Label显示文本else:clicked = Falsevar.set('')# 创建窗口
window = tk.Tk()
window.title("Let's study Button")
window.geometry('300x200')# 创建一个Tkinter中的字符串变量
var = tk.StringVar()
# 创建一个标签
label = tk.Label(window, textvariable=var, font=('Consolas', 14), bg='red', fg='black', width=20, height=4)
label.pack()# 创建button控件
button = tk.Button(window, text='Click it', font=('Consolas', 12), bg='black', fg='white', width=10, height=2, command=Clicked)
button.pack()window.mainloop()

测试效果

3. pack方法和grid方法以及Text和Entry的应用

 通过前面的学习,我们已经知道pack方法是用来放置一个控件的,它具有几个常用的属性如:side、anchor、expand、fill,这里我们重点介绍side和anchor。side有四个值:left、right、top和bottom,分别代表左右顶底。anchor是以上下左右(东西南北)来指示位置的,如nw代表左上方(西北方)、n代表上方(北方)。详细的可以参照博主快乐清风客写的文章,写得非常详细。https://blog.csdn.net/superfanstoprogram/article/details/83713196

​ 另外一个是我非常推荐使用的grid方法,grid方法具有如下几个常用属性:row、column、padx、pady。
​ row和column是行和列的意思,它会将空间划分为一个二维表格,用行和列表示位置。padx和pady是表示水平间距和垂直间距。
​ 此外还有一个place方法是使用绝对坐标来定位的,这里我们略过,有兴趣可以去搜索一下。
​ 多说无用,看代码吧!

"""
作者:Tuzki
日期:2020-09-26
"""
# 导入tkinter库,并从math库中导入gcd函数
import tkinter as tk
from math import gcd# 定义一个函数,与按钮链接,求最大公约数
def clicked():# 清空text框text.delete(1.0, 'end')# 使用get方法从输入框中获取数据(默认为字符串),转换为整型# 并使用gcd求出最大公约数result = gcd(int(entry1.get()), int(entry2.get()))# 将最大公约数result插入到文本框text中text.insert('insert', result)# 此处的'insert'为插入模式,表示在光标处插入# 还有一个参数为'end',表示从在结尾插入# 此处使用任意一个参数对输出结果都没有影响
# 注:每次调用函数时必须清空文本框,否则将会导致下一次输出时上一次输出结果依然停留# 创建窗口
window = tk.Tk()
window.title('求最大公约数的简单程序')
window.geometry('300x200')# 创建标签
label1 = tk.Label(window, text='输入数1', font=('Consolas', 14), width=6, height=2)
label2 = tk.Label(window, text='输入数2', font=('Consolas', 14), width=6, height=2)
# 使用grid放置标签,将标签分别放在第0行第0列和第0行第1列
label1.grid(row=0, column=0)
label2.grid(row=0, column=1)# 创建输入框,设定宽度为10
entry1 = tk.Entry(window, font=('Consolas', 12), width=10)
entry2 = tk.Entry(window, font=('Consolas', 12), width=10)
# 使用grid放置输入框,将它们分别放在第1行第0列和第1行第1列,并调整水平间距为5
entry1.grid(row=1, column=0, padx=5)
entry2.grid(row=1, column=1, padx=5)# 创建按钮,使用command属性链接函数clicked(不能带参数)
button = tk.Button(window, text='求最大公约数', font=('Consolas', 14),width=12, height=2, command=clicked)
# 放置按钮,调整水平间距为5,垂直间距为20
button.grid(row=2, column=0, padx=5, pady=20)# 创建文本框并放置
text = tk.Text(window, font=('Consolas', 12), width=20, height=2)
text.grid(row=2, column=1, padx=5, pady=20)# 窗口循环
window.mainloop()

测试效果

4. 使用Frame对窗口进行空间规划

 Frame是一个容器控件,是一个矩形区域,可以承载其他控件,类似于CSS中的div,使用Frame可以更好地规划窗口。比如说,像下图求最大公约数,如果使用grid函数来放置按钮,那么,第二个按钮是放在第1行(从0计数)的第2列还是第3列呢?答案是只能放在第二或第三列,那么界面将会变得不协调,于是我们把它划分为多个框,每个框是一个单独的表格,每个表格之间的行列宽高不相互影响,就能很好地解决这一问题。
"""
作者:Tuzki
日期:2020-09-23
"""
"""
作者:Tuzki
日期:2020-09-23
"""
import tkinter as tk
import math# 求两个数的最大公约数
def Execution2():text.delete(1.0, 'end')gcd2 = math.gcd(int(entry1.get()), int(entry2.get()))text.insert('insert', "{}".format(gcd2))# 求三个数的最大公约数
def Execution3():text.delete(1.0, 'end')gcd2 = math.gcd(int(entry1.get()), int(entry2.get()))gcd3 = math.gcd(gcd2, int(entry3.get()))text.insert('insert', "{}".format(gcd3))# 求四个数的最大公约数
def Execution4():text.delete(1.0, 'end')gcd2 = math.gcd(int(entry1.get()), int(entry2.get()))gcd3 = math.gcd(gcd2, int(entry3.get()))gcd4 = math.gcd(gcd3, int(entry4.get()))text.insert('insert', "{}".format(gcd4))# 创建窗口
window = tk.Tk()
window.title("求最大公约数 by Tuzki")
window.geometry("800x240")# 创建并使用pack方法进行放置2个Frame
frame_top = tk.Frame(window, width=100, height=2)
frame_bottom = tk.Frame(window, width=100, height=40)
frame_top.pack(side='top')
frame_bottom.pack()# 在frame_bottom里再放置两个Frame
frame_bottom1 = tk.Frame(frame_bottom, width=100, height=16)
frame_bottom2 = tk.Frame(frame_bottom, width=100, height=16)
frame_bottom1.pack(side='top')
frame_bottom2.pack(side='bottom')# 创建并放置label,后续不会调用到,因此不使用变量存放,直接设定并放置
tk.Label(frame_top, text='输入数1', width=16, font=('Consolas', 14)).grid(row=0, column=0)
tk.Label(frame_top, text='输入数2', width=16, font=('Consolas', 14)).grid(row=0, column=1)
tk.Label(frame_top, text='输入数4', width=16, font=('Consolas', 14)).grid(row=0, column=2)
tk.Label(frame_top, text='输入数3', width=16, font=('Consolas', 14)).grid(row=0, column=3)
# 若直接返回label().grid/pack,程序将会报错!# 创建并放置entry,后续会调用到,因此使用变量存放
entry1 = tk.Entry(frame_top, show=None, width=10, font=('Consolas', 14))
entry2 = tk.Entry(frame_top, show=None, width=10, font=('Consolas', 14))
entry3 = tk.Entry(frame_top, show=None, width=10, font=('Consolas', 14))
entry4 = tk.Entry(frame_top, show=None, width=10, font=('Consolas', 14))
entry1.grid(row=1, column=0, padx=30, pady=5)
entry2.grid(row=1, column=1, padx=30, pady=5)
entry3.grid(row=1, column=2, padx=30, pady=5)
entry4.grid(row=1, column=3, padx=30, pady=5)# 创建并放置三个按钮,为了提高代码可读性分开设定和放置
button1 = tk.Button(frame_bottom1, text='求2个数的最大公约数', font=('Consolas', 14), command=Execution2)
button2 = tk.Button(frame_bottom1, text='求3个数的最大公约数', font=('Consolas', 14), command=Execution3)
button3 = tk.Button(frame_bottom1, text='求4个数的最大公约数', font=('Consolas', 14), command=Execution4)
button1.grid(row=0, column=0, padx=20, pady=20)
button2.grid(row=0, column=1, padx=20, pady=20)
button3.grid(row=0, column=2, padx=20, pady=20)# 使用pack中的anchor属性,将label放置到frame_top2的左上角
tk.Label(frame_bottom2, text='最大公约数为:', font=('Consolas', 14)).pack(anchor='nw')# 创建并放置文本框用于输出
text = tk.Text(frame_bottom2, height=2, width=70, font=('Consolas', 14))
text.pack(side='bottom')# 维持窗口
window.mainloop()

5. 使用Pyinstaller对程序进行打包

  • 下载安装Pyinstaller:下载Pyinstal有两种方法,一种是通过cmd命令行下载,一种是通过网站下载。
  1. 使用CMD命令行下载:
pip install pyinstaller
  1. 通过网站下载:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyinstaller
    然后在下载目录下使用cmd命令安装:
pip install "文件名.whl"

以我为例,我是使用pip install "PyInstaller-3.6-py2.py3-none-any.whl"安装的。
安装过程中可能会遇到pip版本太老难以下载安装的问题,推荐逐一使用以下命令进行更新,直到更新成功。

python -m pip install --upgrade pip
python -m pip install -U --force-reinstall pip
pip install --user --upgrade pip
  • 使用Pyinstaller将程序打包
    在源代码(.py)文件所在目录下,使用cmd命令行将程序打包
pyinstaller -w -F 文件名.py

-w和-F是表示去掉控制台窗口并生成单个可执行文件。

各个输入参数的含义:

  • F 表示生成单个可执行文件
  • w 表示去掉控制台窗口,对于GUI图形界面非常有用,但如果你编写的是控制台程序那就忽略这个参数吧
  • p 表示你自己自定义需要加载的类路径,一般情况下用不到
  • i 表示可执行文件的图标

如果对CMD命令行不了解,可以看我的另一篇博文:
https://blog.csdn.net/tuzkizki/article/details/107014794

使用Tkinter编写一个简单的窗口应用相关推荐

  1. python语言的记事本在哪_用python语言编写一个简单记事本

    看了一点python的基础教程,忍不住手就痒了,找来一个题目练一下喽. 题目:编写一个功能简单的记事本. 编写记事本就要用到GUI的功能,最常用的当然是wxpython,那么我们就用这个来写一个记事本 ...

  2. 如何用FFmpeg编写一个简单播放器详细步骤介绍

    如何用FFmpeg编写一个简单播放器详细步骤介绍(转载) FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具.FFMPEG几乎为你把所有的繁重工作都做了,比如解码.编码.复用和解复用. ...

  3. 如何编写一个简单的 Python 程序

    本教程将教你如何编写一个简单的 Python 程序.我们将从解释 Python 程序是什么开始,然后继续讨论语法的各个方面,即语言的结构. 什么是 Python? Python是一种越来越受欢迎的编程 ...

  4. linux实验三:基于mykernel 2.0编写一个简单的操作系统内核

    实验内容 按照https://github.com/mengning/mykernel的说明配置mykernel 2.0,熟悉Linux内核的编译:基于mykernel 2.0编写一个操作系统内核,参 ...

  5. 从头学C语言——(1)编写一个简单的C程序

    编写一个简单的C程序 编译器安装完成之后,我们就可以用它来编写代码了. 这里用Dev C++作为示例,我的是5.11的版本(后续版本是其他人开发的分支版本). 1.双击打开软件, 2.点击左上角工具栏 ...

  6. 编写一个最简单的.php,学习猿地- 说明 如果我们要编写一个简单的PHP脚本,需要学习哪些...

    说明 如果我们要编写一个简单的 PHP 脚本,需要学习哪些基础知识呢? PHP 基础 PHP 脚本可放置于文档中的任何位置. 标准 的 PHP 脚本以 <?php 开头,以 ?> 结尾: ...

  7. java编写存钱_用Java编写一个简单的存款

    package desposit.money; public class DespositMoney { public static void main(String[] args) { Custom ...

  8. python脚本编写_如何用Python包编写一个简单的脚本,表达你对父母的爱?

    全文共2800字,预计学习时长6分钟 在繁忙的工作生活中,我们经常忘记给所爱的人发WhatsApp.本教程将使用Python包Twilio编写一个简单的Python脚本来发送WhatsApp消息.我们 ...

  9. 用java编写一个简单计算器

    java 采用java编写一个简单计算器,使用awt和swing 代码如下: import java.awt.Color; import java.awt.Font; import java.awt. ...

最新文章

  1. 【IT笔试面试题整理】不用加减乘除做加法
  2. 转: 理解AngularJS中的依赖注入
  3. ThinkPHP 数据库表结构处理类(简单实用)
  4. Mac python3.x使用HTMLTestRunner.py生成html格式的测试报告
  5. 严定贵:互联网金融的速度与激情
  6. boost::math::policies用法的测试程序
  7. Tensorflow 入门教程
  8. kafka的消费者客户端偏移的维护
  9. css属性中如果后面个三个值,那么中间的那个一般代表左右元素的值。
  10. 给还在迷茫的你分享我从零基础的日语文科生半路出家搞Python如何上岸的
  11. Win11用户好消息 影响win11性能运行的竟是它,关闭可提升性能
  12. 苹果笔记本电脑我的计算机在哪里设置密码,Mac小教程:设置苹果Mac电脑的开机密码...
  13. 电脑默认重置html,windows10电脑默认自带浏览器被篡改如何恢复
  14. 武汉php的工资是多少钱,在武汉工作,月薪5000元属于什么水平?
  15. 量手知姓氏 :算命测姓氏 之 数学原理
  16. 微云html网页,微云收藏在哪里_以及腾讯微云收藏网页版怎么用? - 软件教程 - 格子啦...
  17. Win11如何查看硬盘型号?Win11查看硬盘型号步骤
  18. android视频播放异常,Android 播放视频常见问题小结
  19. WinDBG技巧:this指针的常见误区 (ECX寄存器存放this指针)
  20. SPI通讯协议详解 基于STM32

热门文章

  1. 基数和权值对于各进制之间转换的意义
  2. 提高沉浸感,PS VR飞行游戏与飞行摇杆更配!
  3. C# 实现对PPT编辑
  4. wsl 2和vmware player不兼容
  5. python selenium 爬取去哪儿网的数据
  6. 订阅号留言功能开通之留言小程序
  7. Fatfs U盘写入文件遇到的问题
  8. 好用的PDF转换PPT软件推荐
  9. 2.天气预报:解释批处理WSDL-SQUARED.CMD生成的主要的类
  10. Neo4j批量插入(Batch Insertion)