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()