持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
需求是这样子的,现在有许多商品,商品的单价都是已知的,我现在有一些钱,需要知道所有能够支付的商品可选择方案。而且所有的商品单价是存放在excel表格中的,商品单价精确到小数点后两位,总钱数精确到小数点后一位,也就是人民币的一角。
界面好说,只保留一个输入框即可,主要是算法,在计算完成之后按照列存放到excel表格中。
下面直接上代码
from tkinter import ttk,messagebox
from tkinter import filedialog
from tkinter import *
import tkinter as tk
import openpyxl
import xlrd
import math
target=0
arry=[]
arryT=[]
filepath=''
def readExcel(path):
# 打开excle
xl = xlrd.open_workbook(path)
# 通过索引获取工作表
table = xl.sheets()[0]
# 获取第一列的整列的内容
col = table.col_values(0)
return col
def integerly(path):
array = readExcel(path)
for i in range(len(array)):
array[i]=array[i]*100
array[i]=math.ceil(array[i])
return array
#todo 递归回溯求解符合要求的解
def digui(index, num,arry,arryT,target):
if index < 0:
return
if num > target:
return
if num == target:
temp = []
for i in range(len(arryT)):
if (arryT[i] == 0):
continue
else:
for j in range(arryT[i]):
temp.append(arry[i])
arrys.append(temp)
return
arryT[index] += 1
digui(index, num + arry[index],arry,arryT,target)
arryT[index] -= 1
digui(index-1, num,arry,arryT,target)
return arrys
#todo 将得到的所有情况化为保留两位小数的浮点数,并将结果返回
def floatly(array):
for i in range(len(array)):
Temp = []
for j in range(len(array[i])):
Temp.append(array[i][j]/100)
arryF.append(Temp)
return arryF
def write_excel_xlsx(path,sheet_name,test):
workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = sheet_name
for i in range(len(test)):
for j in range(len(test[i])):
sheet.cell(j+1,i+1,value=str(test[i][j]))
workbook.save(path)
print("数据写入成功!")
def selectPath():
sheet_name = "Sheet1"
path_ = filedialog.askopenfilename()
path_ = path_.replace("/", "\\")
arry = integerly(path_)
target=math.ceil(txt.get()*100)
arryT = [0 for i in range(len(arry))]
TT = digui(len(arry) - 1, 0,arry,arryT,target)
SS = floatly(TT)
write_excel_xlsx("./Result.xlsx",sheet_name,SS)
def change_option():
top = tk.Tk() # *********
top.withdraw() # ****实现主窗口隐藏
top.update() # *********需要update一下
txt = tk.messagebox.showinfo(message=("先输入数据,然后选择路径"))
top.destroy()
def input_option():
top = tk.Tk() # *********
top.withdraw() # ****实现主窗口隐藏
top.update() # *********需要update一下
txt = tk.messagebox.showinfo(message=("精度最高为小数点后两位"))
top.destroy()
def output_option():
top = tk.Tk() # *********
top.withdraw() # ****实现主窗口隐藏
top.update() # *********需要update一下
txt = tk.messagebox.showinfo(message=("结果存储在与选择文件路径相同,原文件名字+Result的Excel文件中"))
top.destroy()
def intro_option():
top = tk.Tk() # *********
top.withdraw() # ****实现主窗口隐藏
top.update() # *********需要update一下
txt = tk.messagebox.showinfo(message=("结果文件中每一行为一种结果"))
top.destroy()
def run_option():
top = tk.Tk() # *********
top.withdraw() # ****实现主窗口隐藏
top.update() # *********需要update一下
txt = tk.messagebox.showinfo(message=("如需多次选取文件,请重启后继续操作"))
top.destroy()
arrys = []
arryF = []
root = Tk()
path = StringVar()
txt = DoubleVar()
root.title("V1.0")
root.geometry("430x400")
menubar =Menu(root)
root['menu']= menubar
file_menu =Menu(menubar, tearoff=0)
menubar.add_cascade(label='帮助', menu=file_menu)
lang_menu =Menu(menubar, tearoff=0)
file_menu.add_command(label="软件说明", command = change_option)
file_menu.add_command(label="输入说明", command = input_option)
file_menu.add_command(label="结果输出", command = output_option)
file_menu.add_command(label="结果说明", command = intro_option)
file_menu.add_command(label="运行说明", command = run_option)
Label(root, text="输入数据的和").grid(row=0, column=1,padx=45,pady=100)
Entry(root, textvariable=txt).grid(row=0, column=2)
Button(root, text="路径选择", command=selectPath).grid(row=2, column=2,padx=0,pady=100)
root.mainloop()
界面运行是这样样子的
软件说明按钮
输入说明按钮
结果输出说明,这地方程序做了修改,结果是保存在当前目录下
例如输入如下,总钱数为78时
输出为