import tkinter as tk
from tkinter import filedialog, messagebox
from itertools import combinations
class DataShrinkTool:
def __init__(self, root):
self.root = root
self.root.title("数据缩水工具")
# 初始化变量
self.file_path = tk.StringVar()
self.number_length = tk.IntVar(value=5)
self.consecutive_options = {}
self.even_odd_options = {}
self.mod_options = {}
self.span_options = {}
self.distance_options = {}
self.bold_numbers = tk.StringVar(value="")
self.bold_count = tk.IntVar(value=1)
self.create_widgets()
def create_widgets(self):
frame = tk.Frame(self.root)
frame.pack(padx=10, pady=10)
# 文件选择
tk.Label(frame, text="选择文件:").grid(row=0, column=0, sticky="w")
tk.Entry(frame, textvariable=self.file_path, width=50).grid(row=0, column=1, padx=5)
tk.Button(frame, text="浏览", command=self.open_file).grid(row=0, column=2)
# 数字长度选择
tk.Label(frame, text="数字长度:").grid(row=1, column=0, sticky="w")
tk.Radiobutton(frame, text="5位", variable=self.number_length, value=5).grid(row=1, column=1, sticky="w")
tk.Radiobutton(frame, text="6位", variable=self.number_length, value=6).grid(row=1, column=2, sticky="w")
# 连号筛选
tk.Label(frame, text="连号筛选:").grid(row=2, column=0, sticky="w")
self.consecutive_options["count"] = tk.IntVar(value=0)
tk.Spinbox(frame, from_=0, to=5, textvariable=self.consecutive_options["count"], width=5).grid(row=2, column=1,
sticky="w")
self.consecutive_options["group"] = tk.IntVar(value=0)
tk.Spinbox(frame, from_=0, to=5, textvariable=self.consecutive_options["group"], width=5).grid(row=2, column=2,
sticky="w")
# 奇偶选择
tk.Label(frame, text="奇偶选择:").grid(row=3, column=0, sticky="w")
for i in range(6):
self.even_odd_options[i] = tk.StringVar(value="any")
tk.OptionMenu(frame, self.even_odd_options[i], "any", "odd", "even").grid(row=3, column=i + 1)
# 012路筛选
tk.Label(frame, text="012路筛选:").grid(row=4, column=0, sticky="w")
for i in range(6):
self.mod_options[i] = tk.StringVar(value="any")
tk.OptionMenu(frame, self.mod_options[i], "any", "0", "1", "2").grid(row=4, column=i + 1)
# 首位跨度
tk.Label(frame, text="首位跨度:").grid(row=5, column=0, sticky="w")
self.span_options["min"] = tk.IntVar(value=0)
tk.Spinbox(frame, from_=0, to=9, textvariable=self.span_options["min"], width=5).grid(row=5, column=1,
sticky="w")
self.span_options["max"] = tk.IntVar(value=9)
tk.Spinbox(frame, from_=0, to=9, textvariable=self.span_options["max"], width=5).grid(row=5, column=2,
sticky="w")
# 邻位距离
tk.Label(frame, text="邻位距离:").grid(row=6, column=0, sticky="w")
self.distance_options["min"] = tk.IntVar(value=0)
tk.Spinbox(frame, from_=0, to=9, textvariable=self.distance_options["min"], width=5).grid(row=6, column=1,
sticky="w")
self.distance_options["max"] = tk.IntVar(value=9)
tk.Spinbox(frame, from_=0, to=9, textvariable=self.distance_options["max"], width=5).grid(row=6, column=2,
sticky="w")
# 胆码选择
tk.Label(frame, text="胆码选择:").grid(row=7, column=0, sticky="w")
tk.Entry(frame, textvariable=self.bold_numbers, width=20).grid(row=7, column=1, sticky="w")
tk.Spinbox(frame, from_=0, to=6, textvariable=self.bold_count, width=5).grid(row=7, column=2, sticky="w")
# 筛选按钮
tk.Button(frame, text="开始筛选", command=self.filter_numbers).grid(row=8, column=1, pady=10)
def open_file(self):
file_path = filedialog.askopenfilename(filetypes=[("Text Files", "*.txt")])
if file_path:
self.file_path.set(file_path)
def filter_numbers(self):
file_path = self.file_path.get()
number_length = self.number_length.get()
consecutive_count = self.consecutive_options["count"].get()
consecutive_group = self.consecutive_options["group"].get()
even_odd = {i: self.even_odd_options[i].get() for i in range(number_length)}
mod = {i: self.mod_options[i].get() for i in range(number_length)}
span_min = self.span_options["min"].get()
span_max = self.span_options["max"].get()
distance_min = self.distance_options["min"].get()
distance_max = self.distance_options["max"].get()
bold_numbers = set(map(int, self.bold_numbers.get().split(","))) if self.bold_numbers.get() else set()
bold_count = self.bold_count.get()
try:
with open(file_path, 'r') as f:
numbers = [line.strip() for line in f if len(line.strip()) == number_length]
filtered_numbers = []
for number in numbers:
digits = list(map(int, number))
if not self.check_consecutive(digits, consecutive_count, consecutive_group):
continue
if not self.check_even_odd(digits, even_odd):
continue
if not self.check_mod(digits, mod):
continue
if not self.check_span(digits, span_min, span_max):
continue
if not self.check_distance(digits, distance_min, distance_max):
continue
if not self.check_bold_numbers(digits, bold_numbers, bold_count):
continue
filtered_numbers.append(number)
result = "\n".join(filtered_numbers)
messagebox.showinfo("筛选结果", result)
except Exception as e:
messagebox.showerror("错误", str(e))
def check_consecutive(self, digits, count, group):
groups = []
current_group = []
for i in range(len(digits)):
if not current_group or digits[i] == digits[i - 1] + 1:
current_group.append(digits[i])
else:
if len(current_group) >= 2:
groups.append(current_group)
current_group = [digits[i]]
if len(current_group) >= 2:
groups.append(current_group)
return len([g for g in groups if len(g) >= count]) >= group
def check_even_odd(self, digits, even_odd):
for i, digit in enumerate(digits):
option = even_odd.get(i, "any")
if option != "any":
if (digit % 2 == 0 and option != "even") or (digit % 2 != 0 and option != "odd"):
return False
return True
def check_mod(self, digits, mod):
for i, digit in enumerate(digits):
option = mod.get(i, "any")
if option != "any" and str(digit % 3) != option:
return False
return True
def check_span(self, digits, min_span, max_span):
return min_span <= abs(digits[0] - digits[-1]) <= max_span
def check_distance(self, digits, min_distance, max_distance):
for i in range(len(digits) - 1):
if not (min_distance <= abs(digits[i] - digits[i + 1]) <= max_distance):
return False
return True
def check_bold_numbers(self, digits, bold_numbers, bold_count):
return len(set(digits) & bold_numbers) >= bold_count
if __name__ == "__main__":
root = tk.Tk()
app = DataShrinkTool(root)
root.mainloop()对这段代码进行优化