栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

使用Tkinter 制作一个GUI界面的小程序幷封装成EXE

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Tkinter 制作一个GUI界面的小程序幷封装成EXE

使用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的代码文件名)就可以了。
完成的效果如下:
以上就是个人的一些只是分享。学无止境,千万别放弃!!!共勉

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886770.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号