通过tkinter(ttk)可视化计算拼单每个人的优惠价

   日期:2020-09-29     浏览:104    评论:0    
核心提示:背景在日常生活中,常常会遇到因平台优惠最低价比较高,所以需要和朋友拼单购买的情况,如买外卖时的满减优惠、天猫双十一“满400减xxx”等活动。在计算费用时,需要计算各自需要支付给买单人的价格。我本人就是常常和单位同事一起拼单点汉堡王外卖,享受55-20、120-55等优惠。所以通过这个场景可以练习部分GUI及其他python技巧,并增加。效果图刚打开时的页面计算后的页面,页面也根据账单结果的长度,做了自适应账单结果页面适合截图发到群里python代码# -*- codin

背景

在日常生活中,常常会遇到因平台优惠最低价比较高,所以需要和朋友拼单购买的情况,如买外卖时的满减优惠、天猫双十一“满400减xxx”等活动。在计算费用时,需要计算各自需要支付给买单人的价格。我本人就是常常和单位同事一起拼单点汉堡王外卖,享受55-20、120-55等优惠。
所以通过这个场景可以练习部分GUI及其他python技巧,并增加计算效率。

效果图

刚打开时的页面


计算后的页面,页面也根据账单结果的长度,做了自适应

账单结果页面适合截图发到群里

python代码

# -*- coding: UTF-8 -*-
from datetime import datetime
import tkinter as tk
from tkinter import ttk #比一般的tk更好用,有部分新增的功能,如tab切换


choiselist = ["小A","小B","小C","小D","小E","小F","小G","小H","小I"] #人员名单
nmax = len(choiselist)
path = "19.png" #图片路径

windows=tk.Tk() #创建窗口
windows.title('优惠均衡计价器') #窗口名
windows.geometry('430x%s' % (nmax*30+120)) #根据名单长度适应窗口初始大小
windows.resizable(height=True) #高度可变


#建立tab切换组件
tabControl = ttk.Notebook(windows)
tab1 = ttk.Frame(tabControl)
tabControl.add(tab1, text='填写信息')
tab2 = ttk.Frame(tabControl)
tabControl.add(tab2, text='账单结果')
tabControl.pack(expand=1, fill="both")

#建立第一个tab页面
tab1_win = ttk.LabelFrame(tab1)
tab2_win = ttk.LabelFrame(tab2)
tab1_win.grid(column=0, row=0, padx=8, pady=4) #通过padx、pady参数留一部分空白间距
tab2_win.grid(column=0, row=0, padx=8, pady=4)

## 第二个tab页中元素
cal_text = tk.StringVar() #定义一个动态的文本
cal_text.set("暂无数据")
tk.Message(tab2_win, textvariable=cal_text, width=400).grid(row=0, column=0) #新建结果文本
photo = tk.PhotoImage(file=path)

## 设置多组,用exec()函数,循环取变量名
for i in range(nmax):
    ii = i+1
    exec('label%s1 = ttk.Label(tab1_win, text="%s、 姓名:").grid(column=0, row=%s, sticky="W")' % (ii, ii, i))
    exec('label%s2 = ttk.Label(tab1_win, text=choiselist[i]).grid(column=1, row=%s, sticky="W")' % (ii, i))
    exec('label%s3 = ttk.Label(tab1_win, text="商品金额:").grid(column=2, row=%s, sticky="E")' % (ii, i))
    exec('entry%s = ttk.Entry(tab1_win, width=16)' % ii)# 创建一个金额输入框
    exec('entry%s.grid(column=3, row=%s, padx=2)' % (ii, i))# 在这里因为要get()Entry中的值,所以需要单独.grid()
    exec('entry%s.insert(0,"0")' % ii) # 默认为"0"

## 按键B_add对应的程序,计算各成员金额,并输入至tab2中
def cal(nmax):
    list_money=[]
    global photo #需要全局调用photo 不然无法显示
    total = 0
    nn = 0
    for i in range(nmax):
        dict = { }
        exec("dict['money1'] = float(entry%s.get())" %(i+1)) #因为Entry的名称是不固定的,所以要用exec()函数调取
        dict["name"] = choiselist[i]
        total += dict['money1']
        list_money.append(dict) #写入列表中
        if dict['money1'] > 0: #为窗口适应做准备
            nn += 1
    fact = float(entry_fact.get()) #获取实际总付款额
    if total != 0:
        rate = fact / total
        for ii in range(nmax):
            list_money[ii]["money2"] = list_money[ii]["money1"] * rate
        now = datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 获取当前时间,并用strftime格式化
        text = "账单时间:" + now + "\n" + "商品总价:%.2f元" % total +" 折扣:%.2f " % (rate*100) +"% \n\n个人账单如下:"
        ## 只展示实际下单的人
        for dict in list_money:
            if dict["money1"] != 0:
                text = text + "\n" + dict["name"]+" 商品价值:%.2f" % dict["money1"] + " 应付款:%.2f" % dict["money2"]
            else:
                continue
        text = text + "\n \n"+ "付款码如下,请尽快付款,谢谢!"
        tk.Label(tab2_win, image=photo).grid(row=1, column=0)  # 把图片通过标签类展示出来
        ## 窗口适应
        xx = nmax*30+120
        yy = nn * 15 + 400
        if xx < yy:
            windows.geometry('430x%s' % yy)
    else:
        text = "请输入正确字符"
    cal_text.set(text) #将text更新至 cal_text 中

## 输入实际总付款额入口
label_fact = ttk.Label(tab1_win, text="实际总付款额:").grid(column=2, row=nmax, sticky='E')
entry_fact = ttk.Entry(tab1_win, width=16)
entry_fact.grid(column=3, row=nmax, padx=2)
ttk.Label(tab1_win, text=" ").grid(column=2, row=nmax+1)#建立空白行
##设置按键
B_add=tk.Button(tab1_win, text="开始计算", width=20, command=lambda:cal(nmax)).grid(column=3, row=nmax+2, padx=3)

windows.mainloop()#生成前端窗口
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服