使用tkinter制作一款商品选择器

189 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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()

界面运行是这样样子的

image.png

软件说明按钮

image.png

输入说明按钮

image.png

结果输出说明,这地方程序做了修改,结果是保存在当前目录下

image.png

例如输入如下,总钱数为78时

image.png

image.png

输出为

image.png

image.png

image.png

image.png