Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。
由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能 import Tkinter 库、而且 IDLE 也是用 Tkinter 编写而成、对于简单的图形界面 Tkinter 还是能应付自如的。
对于python初学者来讲,通过基础包Tkinter入门后,再学习其他的GUI库也能起到事半功倍的效果。
要写属于自己的GUI程序,首先要了解 Tkinter 的全局思想
即创建一个空白的GUI对象>>添加元素>>激活GUI窗口
import tkinter as tk # 使用Tkinter前需要先导入
window = tk.Tk() # 开局:实例化object,建立窗口window
#...
#... # 添加元素
#...
window.mainloop() # 收尾:激活GUI窗口
每次创建GUI窗口,都是必然以建立对象开头,激活窗口收尾
上诉代码运行结果,因为没有添加元素,随意激活的窗口也是空白的。
接下来需要了解窗口中的元素如何添加:
介绍一些简单元素:例如文本信息,输入框,按钮等
首先从基本参数开始:设置标题,标题,大小。
import tkinter as tk
# 第1步,实例化object,建立窗口window
window = tk.Tk()
# 第2步,给窗口的可视化起名字
window.title('Tkinter:从入门到放弃')
# 第3步,设定窗口的大小(长 * 宽)
window.geometry('600x200') # 这里的乘是字母小x
# 收尾:激活GUI窗口
window.mainloop()
流程:先创建一个元素对象,然后将其放置在GUI窗口内
放置标签的方式一共有三种:相对布局pack
、绝对布局place
、表格布局grid
相对布局:直接将元素按顺序布局在窗口内
绝对布局:按照指定的坐标,将元素放入窗口
表格布局:按照结构化坐标放置元素
布局设置可以参考此文
利用tk.Label()
创建一个文本标签对象,然后使用相对布局pack()
将其放置
单行语法:
tk.Label(self, text, font, width, height).pack()
import tkinter as tk
# 第1步,实例化object,建立窗口window
window = tk.Tk()
# 第2步,给窗口的可视化起名字
window.title('Tkinter:从入门到放弃')
# 第3步,设定窗口的大小(长 * 宽)
window.geometry('600x200') # 这里的乘是小x
# 第4步,在图形界面上设定文本标签(为了阅读性分开构建)
l = tk.Label(window, text='论如何卸载python?', font=('Arial', 12), width=30, height=2, bg='green')
# 说明: bg为背景,text为文本内容,font为字体,width为长,height为高,这里的长和高是字符的长和高。
# 第5步,放置标签
l.pack()
# 收尾:激活GUI窗口
window.mainloop()
import tkinter as tk
# 第1步,实例化object,建立窗口window
window = tk.Tk()
# 第2步,给窗口的可视化起名字
window.title('Tkinter:从入门到放弃')
# 第3步,设定窗口的大小(长 * 宽)
window.geometry('600x500') # 这里的乘是小x
# 第4步,在图形界面上设定文本标签(为了阅读性分开构建)
l = tk.Label(window, text='论如何卸载python?', font=('Arial', 12), width=30, height=2)
# 说明: bg为背景,text为文本内容,font为字体,width为长,height为高,这里的长和高是字符的长和高。
# 第5步,放置标签
l.pack()
lists1 = '删除python'
lists2 = ['安装英雄联盟','安装王者荣耀']
listb = Listbox(window) # 创建两个列表组件
listb2 = Listbox(window)
listb.insert(0,lists1) # 第一个小部件插入数据
for item in lists2: # 第二个小部件插入数据
listb2.insert(0,item)
listb.pack() # 将列表组件放置到主窗口中
listb2.pack()
# 收尾:激活GUI窗口
window.mainloop()
接下来就是比较常用的,点击按钮了
通常来讲,点击按钮都需要绑定一个功能,点击后执行。
我们来看看点击后弹出一个提示窗口该如何操作吧
import tkinter as tk
import tkinter.messagebox as tkMB # 用以构建弹出窗口
window= tk.Tk()
# 为按钮功能建立一个函数,该函数必须创建在之前。
def buttons():
tkMB.showinfo("弹出窗口的标题", "弹出窗口的内容")
# 说明:前面为弹出窗口的标题,后面为弹出窗口的内容.
# 创建一个按钮,并(内容自己自由编写),供点击按钮时调用
b = tk.Button(window, text ="点我", command = buttons)
# 说明:text为按钮中的文本内容,command通常为绑定的函数功能,
# 调用命令参数command=函数名,点击按钮后会执行该函数。
# 放置按钮
b.pack()
window.mainloop()
基于以上,我们来扩展一下看看还能怎样绑定功能吧,运行下方代码试试。
import tkinter as tk
# 第1步,实例化object,建立窗口window,并设定基本参数
window = tk.Tk()
window.title('来玩玩吧')
window.geometry('500x100')
# 第2步,在图形界面上设定标签
var = tk.StringVar() # 将label标签的内容设置为字符类型,用var来接收hit_me函数的传出内容用以显示在标签上
l = tk.Label(window, textvariable=var, bg='green', fg='white', font=('Arial', 12), width=30, height=2)
# 说明: bg为背景,fg为字体颜色,font为字体,width为长,height为高,这里的长和高是字符的长和高
l.pack()
# 为按钮功能建立一个函数,该函数必须创建在之前。
click = False
def buttons():
global click
if click== False:
click= True
var.set('你戴上了绿帽,并表示爱不释手~')
else:
click= False
var.set('')
# 第3步,在窗口界面设置放置Button按键
b = tk.Button(window, text='戴帽子', font=('Arial', 12), width=10, height=1, command=buttons)
b.pack()
# 收尾,激活
window.mainloop()
当我们需要加入选择选项时,可分为两种情况:
Radiobutton
相互独立选项,选了A就不能选B
Checkbutton
非独立选项,即可同时多选互相共存的选项.
# 第1步
window = tk.Tk()
window.title('性别测试')
window.geometry('500x150')
# 第2步,在图形界面上创建一个标签label用以显示并放置
var = tk.StringVar() # 定义一个var用来将radiobutton的值和Label的值联系在一起.
l = tk.Label(window, bg='yellow', width=20, text='你的性别?')
l.pack()
# 第3步,定义选项触发函数功能
def sex_selection():
l.config(text='你....' + var.get())
# 第4步,创建三个独立选项,其中variable=var, value='A'的意思就是,当我们鼠标选中了其中一个选项,把value的值A放到变量var中,然后赋值给variable
r1 = tk.Radiobutton(window, text='男', variable=var, value='是臭男人啊', command=sex_selection)
r1.pack()
r2 = tk.Radiobutton(window, text='女', variable=var, value='是女孩子吖', command=sex_selection)
r2.pack()
r3 = tk.Radiobutton(window, text='?', variable=var, value='是人妖?', command=sex_selection)
r3.pack()
window.mainloop()
# 第1步
window = tk.Tk()
window.title('我的老婆')
window.geometry('500x100')
# 第2步,在图形界面上创建一个标签label用以显示并放置
l = tk.Label(window, bg='yellow', width=20, text='小孩子才做选择')
l.pack()
# 第3步,定义触发函数功能
def wife_selection():
if (var1.get() == 1) & (var2.get() == 0): # 如果选中第一个选项,未选中第二个选项
l.config(text='我喜欢周冬雨 ')
elif (var1.get() == 0) & (var2.get() == 1): # 如果选中第二个选项,未选中第一个选项
l.config(text='我喜欢关晓彤')
elif (var1.get() == 0) & (var2.get() == 0): # 如果两个选项都未选中
l.config(text='我两个都不喜欢')
else:
l.config(text='我全都要') # 如果两个选项都选中
# 第4步,定义两个Checkbutton选项并放置
var1 = tk.IntVar() # 定义var1和var2整型变量用来存放选择行为返回值
var2 = tk.IntVar()
c1 = tk.Checkbutton(window, text='周冬雨',variable=var1, onvalue=1, offvalue=0, command=wife_selection) # 传值原理类似于radiobutton部件
c1.pack()
c2 = tk.Checkbutton(window, text='关晓彤',variable=var2, onvalue=1, offvalue=0, command=wife_selection)
c2.pack()
# 收尾,激活
window.mainloop()
…有空继续更新
为朋友写了个数据处理脚本
from pandas import read_excel
from pandas import read_csv
from tkinter import Tk
from tkinter import Label
from tkinter import Entry
from tkinter import StringVar
from tkinter import Radiobutton
from tkinter import Button
from tkinter.messagebox import showinfo
from os import makedirs
from os.path import exists
from os.path import expanduser
from os.path import basename
def md(paths):
if not exists(paths):
makedirs(paths)
def GUI():
window = Tk()
window.title('转换脚本3.0')
window.geometry('400x350')
l = Label(window, text='请输入文件路径及文件名', font=('Arial', 12), width=30, height=2)
l.pack()
e = Entry(window, show = None,width=40)
e.pack()
var = StringVar()
l = Label(window, bg='yellow', width=30, text='请选择文件类型')
l.pack()
def print_selection():
l.config(text='选择文件类型为 ' + var.get())
r1 = Radiobutton(window, text='csv文件 ', variable=var, value='csv逗号分隔符文件', command=print_selection)
r1.pack()
r2 = Radiobutton(window, text='excel文件', variable=var, value='excel表格文件', command=print_selection)
r2.pack()
def breaks():
try:
get_space_txt()
showinfo( "OK", '转换完成')
except:
showinfo( "Error", '请检查文件路径及文件类型是否正确')
def get_space_txt():
filepath=e.get()
types=var.get()
savepath=expanduser("~")+'\\Desktop\\txt\\'
md(savepath)
savefilepath=savepath+basename(e.get())+'\\'
if types=='csv逗号分隔符文件':
with open(filepath,encoding='utf_8_sig') as f:
df=read_csv(filepath,dtype=str)
elif types=='excel表格文件':
df=read_excel(filepath,dtype=str)
for i in df.columns:
df[i]=' '+df[i]
md(savefilepath)
for i in df.columns:
fh = open(savefilepath+i+'.txt', 'w', encoding='utf-8')
fh.write(i+'\n')
for u in df[i].values:
fh.write(str(u)+'\n')
fh.close()
b = Button(window, text='确定', width=20,height=2, command=breaks)
b.pack()
def quits():
window.quit()
q = Button(window, text='退出', width=20,height=2, command=quits)
q.pack()
n = Label(window, text='by: hao-lf', font=('Arial', 10), width=30, height=2)
n.pack()
t = Label(window, text='说明: 将表格文件的每个维度分别转换\n为txt字段,并为每行添加首空格,转换\n完成后生成在桌面 txt 文件夹中。', font=('Arial', 9), width=30, height=3)
t.pack()
window.mainloop()
if __name__=='__main__':
GUI()
未完待续…有空再写