赞
踩
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及以上版本进行学习。
# 导入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() # 这一行代码将不断刷新窗口,所有的窗口文件都必须有这一命令,如果没有这一命令窗口将不会显示
测试效果
# 导入tkinter模块 import tkinter as tk clicked = False def Clicked(): global clicked # 点一次,显示Label显示文本 if clicked == False: clicked = True var.set('You have clicked it!') # 再点一次,清除Label显示文本 else: clicked = False var.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()
测试效果
通过前面的学习,我们已经知道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()
测试效果
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()
pip install pyinstaller
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 -w -F 文件名.py
-w和-F是表示去掉控制台窗口并生成单个可执行文件。
各个输入参数的含义:
如果对CMD命令行不了解,可以看我的另一篇博文:
https://blog.csdn.net/tuzkizki/article/details/107014794
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。