Python-求和附界面(节约版)

import tkinter as tk
from tkinter.scrolledtext import ScrolledText
from tqdm import tqdm
import itertools


class MainWidget:
    def __init__(self):
        # 新建窗体
        self.win = tk.Tk()
        self.win.title("计算求和")
        self.win.geometry('660x420')
        # 创建标签
        agg_label = tk.Label(self.win, text="和")
        agg_label.place(relx=0.1, rely=0, relheight=0.1, relwidth=0.4)
        division_label = tk.Label(self.win, text="求和项")
        division_label.place(relx=0.5, rely=0, relheight=0.1, relwidth=0.4)
        # 创建输入窗体
        self.agg_entry = ScrolledText()
        self.agg_entry.place(relx=0.1, rely=0.1, relheight=0.4, relwidth=0.4)
        self.division_entry = ScrolledText()
        self.division_entry.place(relx=0.5, rely=0.1, relheight=0.4, relwidth=0.4)
        # 创建结果区域
        result_label = tk.Label(self.win, text="求和结果")
        result_label.place(relx=0.1, rely=0.5, relheight=0.05, relwidth=0.8)
        self.result_entry = ScrolledText()
        self.result_entry.place(relx=0.1, rely=0.55, relheight=0.2, relwidth=0.8)
        # 创建运行按钮
        exec_btn = tk.Button(self.win, text='执行计算', command=self.execute)
        exec_btn.place(relx=0.4, rely=0.75, relheight=0.1, relwidth=0.2)
        self.win.mainloop()

    def get_result(self,hope, list_input):
        """
        :param hope: # 期望相加所得参数
        :param list_input: # 所有数值
        :param used: # 已使用过列表,起始数据为空
        :return:
        """

        def generate_combination(items, length):
            for combination in itertools.combinations(items, length):
                result_generate = list(combination)
                # print(result)
                yield result_generate

        # 容差值,避免float计算过小
        epsilon = 0.001
        # 剔除大于目标值部分的列表内容不进行计算
        step_1_list = [i for i in list_input if i < hope]
        # 根据初步判断后的step_1_list,迭代每一种数据长度的可能性
        result = []
        for i in tqdm(range(1, len(step_1_list) + 1)):
            print('当前组合长度:' + str(i))
            # 用迭代器  按照每种长度  生成每种可能
            calculate = generate_combination(items=step_1_list, length=i)
            # 循环迭代结果
            for x in calculate:
                self.win.update()
                # 对迭代器中每个元组求和
                if abs(sum(x) - hope) <= epsilon:
                    result = x
                    print('计算出', hope, ',组合是', result)
                    break  # 如果计算出结果,则终止对迭代结果循环
            else:
                # print('无结果')
                continue  # 未计算出结果,继续对迭代结果循环
            break  # if True 则终止对所有长度可能的循环
        return hope, result

    # 获取内容
    def execute(self):
        sums = self.agg_entry.get(0.0, tk.END)
        divisions = self.division_entry.get(0.0, tk.END)
        # sum_nums = [float(i) for i in re.findall(pattern=num_pattern, string=sums)]
        # division_nums = [float(i) for i in re.findall(pattern=num_pattern, string=divisions)]
        sum_nums = [float(i) for i in sums.split()]
        division_nums = [float(i) for i in divisions.split()]
        print(sum_nums, division_nums)
        # self.division_entry.tag_add('1', 0.0, 3.0)
        # self.division_entry.tag_config('1',background="blue")
        for i in sum_nums:
            hope = self.get_result(i, division_nums)[0]
            result = self.get_result(i, division_nums)[1]
            self.result_entry.insert(tk.END, hope)
            self.result_entry.insert(tk.END, "     ")
            self.result_entry.insert(tk.END, str(result))
            self.result_entry.insert(tk.END, '\n')
            self.win.update()


MainWidget()
posted @ 2024-08-20 01:09  AZ26  阅读(39)  评论(0)    收藏  举报