使用Tkinter 制作一个GUI界面的小程序幷封装成EXE
想要使用制作GUI界面,先要pip install tkinter。我这里因为需要处理excel表格,所以还装了pandas。
第一步:导入需要的模块
import os import pandas as pd from datetime import datetime import tkinter as tk import tkinter.messagebox as msg from tkinter.filedialog import askdirectory
第二步:定义一个类对象,并初始化变量,tk的好多控件用法我也是在各个网站上查来查去,学了点儿皮毛,想要运用自如,还得努力!!!
class ForApp(tk.Frame):
#初始化变量
def __init__(self,master=None):
frame = tk.Frame.__init__(self, master, width=600, height=300, relief='ridge')
self.frame = frame
#使用StringVar函数获取 输入,输出变量
self.InVar = tk.StringVar()
self.OutVar = tk.StringVar()
#输入,输出标签
self.labelframe =tk.LabelFrame(frame,text='处理结果')
self.label = tk.Label(frame,text='处理结果:',bg='SkyBlue',font=('黑体',12,'bold'),bd=8).place(x=10,y=0,relwidth=0.15,relheight=0.1)
self.label1 = tk.Label(frame,text='文件路径 :',bg='SkyBlue',font=('黑体',12,'bold'),bd=9).place(relx=0.033,rely=0.73,relwidth=0.15,relheight=0.1)
#输入栏,输出栏
self.entry = tk.Entry(frame,textvariable=self.InVar,bg='Cyan',font=('黑体',12,'bold'),bd=3).place(relx=0.2,rely=0.73,relwidth=0.5,relheight=0.1)
self.out = tk.Listbox(self.frame,listvariable=self.OutVar,bg='Cyan',font=('黑体',12,'bold'),bd=3).place(relx=0.016,rely=0.083,relwidth=0.97,relheight=0.6)
#按钮
self.runButton = tk.Button(frame,text='按此键执行数据处理',command=self.count_,font=('黑体',12,'bold'),bd=3).place(relx=0.3,rely=0.86,relwidth=0.3,relheight=0.1)
self.seleButton = tk.Button(frame,text='文件浏览...',command=self.viewdirectory,font=('黑体',12,'bold'),bd=3).place(relx=0.75,rely=0.73,relwidth=0.2,relheight=0.1)
下面就是用def定义表格处理的函数了。话不多说,直接上代码。
首先,定义获取文件路径的函数,将拿到的结果用StringVar函数的set方法传给变量self.InVar。
#选择文件路径
def viewdirectory(self):
direc = tk.filedialog.askdirectory()
self.InVar.set(direc)
其次,get_path函数(函数名称可以自定义,自己喜欢就好),这个函数使用了os模块通过for 循环遍历目录下所有符合条件的excel文件,存为列表,并return返回该列表。在这个函数中使用了tk的消息报警的简单用法(下面的excel表格处理中也有用到),感兴趣的同学可以相互借鉴,互相学习。
#循环遍历符合要求的文件名
def get_path(self):
path = self.InVar.get()
fnames = []
if path:
for fname in os.listdir(path):
if fname.startswith('优免统计详情') and fname.endswith('.xlsx'):
fnames.append(fname)
else:
msg.showerror('Error','错误!请选择文件所在目录...')
if fnames:
return fnames
else:
msg.showerror('Error','此目录未找到所需文件...')
再次,就是处理excel表的函数了。用到的是数据分析处理必不可少的模块pandas,个人觉得它的功能确实很强大。我这里用到的只是皮毛。主要是通过读取表格,根据车辆的入场时间和出场时间统计出车辆停留的时间,按照给定的计费规则计算出每辆车的实际停车费用,并将所有车辆的费用相加算出合计金额。
#处理数据
def count_(self):
#从界面输入栏获取文件路径
pathdir = self.InVar.get()
results = []
for file in self.get_path():
path = f'{pathdir}/{file}'
#打开表格
df = pd.read_excel(path,header=2,engine='openpyxl')
print(df.head())
try:
#计算时间差
df['时长'] = ((df['出场时间'] - df['入场时间'])/pd.Timedelta(1,'H')).fillna(0)/24
except:
msg.showwarning('Warning','文件格式错误或文件已处理...')
#提取天数和小时
df['day'] = df['时长'].apply(lambda x: int(x))
df['hour'] = df['时长'].apply(lambda x: float(24*(x-int(x))))
#判断df['day']和df['hour']的范围区间,生成df['new_col']并按照判断结果计算的金额
def do_things(row):
if row['day'] == 0:
if 0 < row['hour'] <= 1:
return 5
elif 1 < row['hour'] <= 2:
return 7
elif 2 < row['hour'] < 24:
return 8
else:
return 0
else:
if 0 < row['hour'] <= 1:
return row['day']*8+5
elif 1 < row['hour'] <= 2:
return row['day']*8+7
elif 2 < row['hour'] < 24:
return row['day']*8+8
else:
return 8
#新增列
df['new_col'] = df.apply(do_things,axis=1)
#删除多余的列
df.drop(df.columns[[11,12,13,14]],axis=1,inplace=True)
#修改列名
df.rename(columns={'new_col':'金额'},inplace=True)
#计算合计金额
data = [i for i in df['金额']]
df.loc['Total','金额'] = sum(data)
#保存表格
df.to_excel(path,index=False)
results.append('文件:【{}】 的统计结果: {}元'.format(file,df.loc['Total','金额']))
#将结果列表重置到输出变量
self.OutVar.set((results))
最后,就是调用类实例了。
if __name__ == "__main__":
app = ForApp()
app.master.title('优免统计-数据处理')
width = 600
height = 300
screenwidth = app.winfo_screenwidth()
screenheight = app.winfo_screenheight()
win_center = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
app.master.geometry(win_center)
app.master.resizable(1, 1)
#设置窗口背景色为天空蓝
app.master['bg'] = 'SkyBlue'
app.mainloop()
最最最后,就是用pyinstaller对写好的代码进行封装。没有pyinstaller,同样是pip install pyinstaller。
pyinstaller的相关参数如下图:
如果不是太复杂的代码,直接pyinstaller -F -w 加上(.py的代码文件名)就可以了。
完成的效果如下:
以上就是个人的一些只是分享。学无止境,千万别放弃!!!共勉



