基于随机概率的pthon图形程序

主要功能:勾选随机组数进行随机生成数列,输出所有随机情况。 可以储存,显示历史储存,所有储存交集等功能。                                                                                         import tkinter as tk

from tkinter import filedialog, messagebox

from itertools import product

import random

import itertools

from tkinter import Button

from tkinter import END

from tkinter import scrolledtext

import requests

from bs4 import BeautifulSoup

# 设置超时的异常处理函数

class TextCombinationApp:

    def __init__(self, root):

        self.root = root

        root.title(" 随机选择数列组合软件--By张拯 ")

        # 初始化左侧和右侧的frames

        self.left_frame = tk.Frame(root)

        self.left_frame.pack(side=tk.LEFT, padx=5, pady=5)

        self.keep_selected_indices = []  # 初始化为空列表或具有特定索引的列表

        self.right_frame = tk.Frame(root)

        self.right_frame.pack(side=tk.RIGHT, padx=5, pady=5, fill=tk.BOTH, expand=True)

        self.selected_numbers = set()  # 使用集合来记录选中的数字,避免重复

        self.stored_results = []  # 用于存储所有结果

        # 输入框和复选框列表初始化

        self.entries = []

        self.check_vars = []  # 用于存储每个文本框的复选框的值

        self.group_vars = []  # 用于存储每组的复选框的值

        self.create_widgets()

        # 创建多组文本框和复选框

        for i in range(6):

            frame = tk.Frame(self.left_frame)

            frame.pack(padx=5, pady=5)

            group_var = tk.BooleanVar(value=False)  # 每组的复选框变量

            group_check = tk.Checkbutton(frame, text=f"组 {i+1}", var=group_var)

            group_check.pack(side=tk.LEFT)

            self.group_vars.append(group_var)  # 将每组的复选框变量添加到列表

            group_entries = []

            group_vars = []

            for _ in range(9):

                var = tk.BooleanVar(value=False)

                check = tk.Checkbutton(frame, var=var)

                check.pack(side=tk.LEFT)

               

                entry_text = tk.Entry(frame, width=10)

                entry_text.pack(side=tk.LEFT, padx=2)

               

                group_entries.append(entry_text)

                group_vars.append(var)

           

            self.entries.append(group_entries)

            self.check_vars.append(group_vars)

# 在左侧框架顶部添加提示标签

        notice_label = tk.Label(self.left_frame, text="【注意】:至少保证一列6个输入框的值必须填满才能出结果", fg="red")

        notice_label.pack(side=tk.TOP, pady=(10, 0))  # 在其他组件之上,并添加一些垂直间距

# 创建一个框架用于包含按钮并水平排列

        button_frame = tk.Frame(self.left_frame)

        button_frame.pack(side=tk.TOP)


 

# 添加“12*3数据输入”按钮

        self.data_input_button = tk.Button(button_frame, text="12*3数据输入", command=self.open_data_input_page)

        self.data_input_button.pack(side=tk.LEFT, padx=5, pady=5)

# 清空按钮

        clear_button = tk.Button(button_frame, text="清空勾选", command=self.clear_selections)

        clear_button.pack(side=tk.LEFT, padx=5, pady=5)

        # 创建一个框架用于包含按钮并水平排列

        button_frame = tk.Frame(self.left_frame)

        button_frame.pack(side=tk.TOP)

        # 添加数字选择按钮

        self.number_buttons = []

        for number in range(7):

            button = tk.Button(button_frame, text=str(number), command=lambda n=number: self.toggle_number_selection(n))

            button.pack(side=tk.LEFT, padx=2)

            self.number_buttons.append(button)

# 随机组合按钮

        random_combine_button = tk.Button(button_frame, text="生成勾选后随机数列组合", command=self.random_combine)

        random_combine_button.pack(side=tk.LEFT, padx=5, pady=5)

# 配置Frame以实现水平居中

        button_frame.pack_configure(anchor=tk.CENTER)

# 创建按钮并放置到界面上

       

        save_result_button = tk.Button(button_frame, text="存储结果", command=self.save_current_result)

        save_result_button.pack(side=tk.LEFT)

        # 创建按钮并放置到界面上

        show_intersection_button = tk.Button(button_frame, text="生成所有结果交集", command=self.display_intersection)

        show_intersection_button.pack(side=tk.LEFT)

        # 下载按钮

        download_button = tk.Button(self.left_frame, text="下载到本电脑", command=self.download_results)

        download_button.pack(pady=5)

        self.result_button_frame = tk.Frame(self.root)

        self.result_button_frame.pack(side=tk.LEFT, fill=tk.Y, padx=5, pady=5)  # 改变这里

# 右侧带滚动条的Text控件,设置 width 为 50 个字符宽

        self.result_text = tk.Text(self.right_frame, wrap=tk.WORD, width=20)  # 在这里设置 width

        self.result_text.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

        scrollbar = tk.Scrollbar(self.right_frame, command=self.result_text.yview)

        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        self.result_text.config(yscrollcommand=scrollbar.set)

    def create_widgets(self):

        # ... 省略其他部分 ...

        # 添加获取最新资讯按钮

        self.info_button = tk.Button(self.left_frame, text="获取最新信息【需联网】点击后等待", command=self.get_latest_info)

        self.info_button.pack(side=tk.TOP, padx=5, pady=5)

        # 创建滚动文本框

        self.info_text = scrolledtext.ScrolledText(self.left_frame, wrap=tk.WORD, height=10)

        self.info_text.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

    def get_latest_info(self):

        url = "http://kaijiang.500.com/dlt.shtml"

        try:

            html = requests.get(url, timeout=8).text

            soup = BeautifulSoup(html, 'html.parser')

            pageList = soup.select("div.iSelectList a")[:10]

            for p in pageList:

                page_url = p['href']

                page_html = requests.get(page_url, timeout=8).text

                page_soup = BeautifulSoup(page_html, 'html.parser')

                list = page_soup.select('div.ball_box01 ul li')

                ball = []

                for li in list:

                    ball.append(li.string)

                self.info_text.insert(tk.END, f"第{p.string}期开奖结果: {' '.join(ball)}\n")

        except requests.exceptions.Timeout:

            self.info_text.insert(tk.END, "操作超时,已停止获取最新信息。\n")

        except Exception as e:

            self.info_text.insert(tk.END, "发生错误:" + str(e) + '\n')

# 打开数据输入页面的函数

    def open_data_input_page(self):

    # 创建新的顶层窗口

        self.data_input_window = tk.Toplevel(self.root)

        self.data_input_window.title("12*3数据输入")

    # 创建12行3列的文本输入框

        self.data_entries = []

        for i in range(12):

            row_entries = []

            for j in range(3):

                entry = tk.Entry(self.data_input_window, width=10)

                entry.grid(row=i, column=j, padx=5, pady=5)

                row_entries.append(entry)

            self.data_entries.append(row_entries)

    # 创建确定按钮

        confirm_button = tk.Button(self.data_input_window, text="确定", command=self.process_data_input)

        confirm_button.grid(row=12, column=1, padx=5, pady=5)

    def save_current_result(self):

    # 获取当前显示的结果

        current_result = self.result_text.get("1.0", tk.END).strip()

        if current_result:

        # 将结果分割成列表, 不改变原始顺序

            result_list = current_result.split('\n')

        # 将列表转换为集合,并存储集合用于交集操作

            result_set = set(result_list)

        # 存储有序的列表和集合

            self.stored_results.append((result_set, result_list))

       

        # 创建一个新的按钮,用于显示这个存储的结果

            result_index = len(self.stored_results)

            result_button = tk.Button(self.result_button_frame, text=f"存储{result_index}",

                                    command=lambda idx=result_index - 1: self.show_saved_result(idx))

            result_button.pack(side=tk.TOP, padx=2, pady=2)  # 确保这里是TOP

       

            messagebox.showinfo("存储成功", f"当前结果已存储为 '存储{result_index}'。")

# 清空所有复选框的选择

            for var_list in self.check_vars:

                for check_var in var_list:

                    check_var.set(False)

# 清空每组复选框的选择

            for group_var in self.group_vars:

                group_var.set(False)

        else:

            messagebox.showerror("存储错误", "没有结果可以存储。")

    def show_saved_result(self, index):

        if isinstance(index, int) and index < len(self.stored_results):

        # 获取对应索引的存储结果(忽略集合,使用有序列表)

            saved_result = self.stored_results[index][1]  # 这里选择索引1,即有序列表

            result_text = '\n'.join(saved_result)

            self.result_text.delete('1.0', tk.END)

            self.result_text.insert(tk.END, result_text)

        else:

            messagebox.showerror("错误", "无效的结果索引")

 #   def show_saved_result(self, index):

    # 显示对应索引的存储结果

 #       saved_result = self.stored_results[index]

 #       self.result_text.delete('1.0', tk.END)

  #      self.result_text.insert(tk.END, saved_result)

    def display_intersection(self):

        if not self.stored_results:

            messagebox.showerror("错误", "没有存储的结果可以显示交集。")

            return

   

    # 提取每个元组中的集合并计算交集

        sets_to_intersect = [result_set for result_set, _ in self.stored_results]

        if sets_to_intersect:

            intersection = set.intersection(*sets_to_intersect)

       

        # 将交集转换为排序后的列表

            intersection_sorted = sorted(intersection)

       

        # 将每个元素再次转换为字符串,用换行符连接

            intersection_text = '\n'.join(intersection_sorted)

       

        # 显示交集

            self.result_text.delete('1.0', tk.END)

            self.result_text.insert(tk.END, intersection_text)

        else:

            messagebox.showinfo("信息", "交集为空。")

# 处理数据输入的函数

    def process_data_input(self):

    # 获取输入的数据

        data = []

        for row_entries in self.data_entries:

            row_data = []

            for entry in row_entries:

                row_data.append(entry.get())

            data.append(row_data)

    # 进行数列组合

        combinations = []

        for i in range(0, 12, 2):

            group1 = data[i]

            group2 = data[i+1]

            group_combinations = list(itertools.product(group1, group2))

            combinations.extend(group_combinations)

    # 将组合填入相应的文本框

        for i, combination in enumerate(combinations):

            group_index = i // 9

            entry_index = i % 9

            entry_text = self.entries[group_index][entry_index]

            entry_text.delete(0, tk.END)

            entry_text.insert(tk.END, ''.join(combination))  # 使用空字符串连接组合元素

    # 关闭数据输入窗口

        self.data_input_window.destroy()

    def open_data_input_page(self):

        # 这里应该是打开数据输入页面的逻辑

        pass

    def clear_selections(self):

        # 清空选择

        self.selected_numbers.clear()

        for button in self.number_buttons:

            button.config(relief=tk.RAISED)

    def toggle_number_selection(self, number):

        # 切换数字的选中状态

        if number in self.selected_numbers:

            self.selected_numbers.remove(number)

            self.number_buttons[number].config(relief=tk.RAISED)

        else:

            self.selected_numbers.add(number)

            self.number_buttons[number].config(relief=tk.SUNKEN)

        print(f"Selected numbers: {self.selected_numbers}")


 

    def clear_selections(self):

        # 清空勾选状态

        for group_vars in self.check_vars:

            for var in group_vars:

                var.set(False)

        for group_var in self.group_vars:

            group_var.set(False)

    def get_selected_groups(self):

        # 获取所有组的文本,不管复选框是否被选中

        groups_to_combine = []

        for group_entries in self.entries:

            group_texts = [entry.get() for entry in group_entries if entry.get().strip() != '']

            if group_texts:

                groups_to_combine.append(group_texts)

        return groups_to_combine  # 这个 return 语句正确地缩进在函数内部

    def display_combinations(self, combinations):

    # 过滤掉包含空字符串的组合

        filtered_combinations = [comb for comb in combinations if all(element != "" for element in comb)]

    # 生成要显示的字符串,每个组合用'-'连接,组合之间用换行符分隔

        combined_text = '\n'.join(['-'.join(comb) for comb in filtered_combinations])

    # 清空结果显示区域并插入新的组合字符串

        self.result_text.delete('1.0', tk.END)

        self.result_text.insert(tk.END, combined_text)

    def download_results(self):

        # 获取文本框内容并保存到文件

        text_to_save = self.result_text.get("1.0", tk.END)

        filepath = filedialog.asksaveasfilename(defaultextension="txt", filetypes=[("Text Files", "*.txt"), ("All Files", "*.*")])

        if not filepath:

            return

        with open(filepath, 'w') as output_file:

            output_file.write(text_to_save)

    def random_combine(self):

    # 获取所有组的勾选状态

        group_selection_status = [var.get() for var in self.group_vars]

   

    # 获取所有勾选组的索引

        selected_group_indices = [i for i, selected in enumerate(group_selection_status) if selected]

   

    # 存储所有组合的列表

        all_combinations = []

    # 检查是否有足够的组被选中

        if not self.selected_numbers:

            messagebox.showerror("错误", "请至少选择一个随机组数。")

            return

    # 对于每个选中的数字(即每个随机组数),生成组合

        for num_random_groups in self.selected_numbers:

            if len(selected_group_indices) < num_random_groups:

                messagebox.showerror("错误", f"勾选的组数量少于所需的随机组数 {num_random_groups}。")

                continue  # 继续下一个选中的数字

        # 生成所有可能的随机组索引组合

            for group_indices in itertools.combinations(selected_group_indices, num_random_groups):

            # 初始化用于当前随机组组合的值列表

                current_combination_values = []

           

            # 遍历所有的组

                for i in range(len(self.group_vars)):

                # 如果当前组索引在随机组索引组合中,使用被勾选的文本框值

                    if i in group_indices:

                        selected_values = [entry.get() for entry, check in zip(self.entries[i], self.check_vars[i]) if check.get()]

                # 否则,使用未勾选的文本框值

                    else:

                        selected_values = [entry.get() for entry, check in zip(self.entries[i], self.check_vars[i]) if not check.get()]

               

                # 如果选中的值为空,则跳过此组

                    if not selected_values:

                        continue

                # 添加当前组的选中值

                    current_combination_values.append(selected_values)

           

            # 生成当前随机组组合的所有可能组合

                current_combinations = list(itertools.product(*current_combination_values))

            # 将当前组合添加到所有组合的列表中

                all_combinations.extend(current_combinations)

   

    # 显示所有组合

        self.display_combinations(all_combinations)

if __name__ == "__main__":

    root = tk.Tk()

    app = TextCombinationApp(root)

    root.mainloop()


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值