Python使用Tkinter设计彩票机选软件(第17节)


Python作为一种流行的编程语言,以其简洁、易读和多功能而著称。我们完全可以使用Python来模拟彩票开奖或者彩票机选,通过使用Python的Tkinter库来设计一个彩票开奖或者机选软件,可以非常直观地实现一个用户友好的GUI图形界面。本节教程将介绍如何使用Tkinter库设计彩票开奖或者彩票机选软件。

1、彩票机选软件介绍

我们的目标是开发一个彩票开奖或者彩票机选软件,首先,创建一个图形界面,其中包括两个选择按钮,可以选择随机生成双色球号码,也可以选择随机生成大乐透号码。双色球是一种流行的彩票游戏,主要包含6个红球号码(范围1-33)和1个蓝球号码(范围1-16)。大乐透彩票游戏规则也比较简单,前区选取5个号码(范围1-35),后区选取2个号码(范围1-12)。

在彩票机选主界面,一次性可以生成多注机选结果,还可以点击“保存机选结果”按钮,将机选结果保存到本地的txt文件内。

2、彩票机选软件界面演示

Python使用Tkinter设计彩票机选软件

3、代码实现

(1)导入必要的库

import tkinter as tk
from tkinter import scrolledtext, messagebox
import random
from tkinter import filedialog

这里导入了Tkinter库用于创建GUI应用图形界面,Tkinter的messagebox用于消息提示,scrolledtext‌是Tkinter库中专门用于创建带有滚动条的文本框控件,Tkinter的filedialog模块提供了一个简单的对话框界面,可以让用户选择文件或文件夹。

(2)彩票机选软件的完整代码如下所示:

动手练一练:

import tkinter as tk
from tkinter import scrolledtext, messagebox
import random
from tkinter import filedialog

# 双色球随机生成函数
def generate_lottery():
    # 随机生成6个不重复的红球号码,范围从1到33
    red = random.sample(range(1, 34), 6)

    # 将6个数字升序排序
    red.sort()

    # 随机生成1个蓝球号码,范围从1到16
    blue = random.choice(range(1, 17))

    # 把6个红球号码和1个蓝球号码组成字符串
    result = '红球:' + ' '.join(map(str, red)) + ' ' + '蓝球:' + str(blue)
    return result

# 大乐透随机生成函数
def lottery_numbers():
    # 前区随机生成5个不重复的数字,范围从1到35
    front = random.sample(range(1, 36), 5)

    # 将5个数字升序排序
    front.sort()

    # 后区随机生成2个不重复的数字,范围从1到12
    back = random.sample(range(1, 13),2)

    # 将2个数字升序排序
    back.sort()

    # 将前区5个数字和后区2个数字组成字符串
    result = '前区:' + ' '.join(map(str, front)) + ' ' + '后区:' + ' '.join(map(str, back))
    return result

# 获取随机生成的结果
def run():
    # 获取选择框的值,双色球选择框的值为1,大乐透选择框的值为2
    get_vselected = choose.get()
    result1=""
    # 获取“机选注数”输入框中的数字,确保输入为正整数
    try:
        if number_entry.get().strip() == '':
            return messagebox.showerror('错误!', '请输入注数')
        entry_value = int(number_entry.get())
        if entry_value <= 0:
            raise ValueError("必须是正整数")
        for _ in range(entry_value):
            # 判断选择框的值是1还是2
            if get_vselected == 1:
                result1=result1 +"\n" +generate_lottery()
            else:
                result1=result1 +"\n" +lottery_numbers()
    except ValueError:
        messagebox.showerror("输入错误", f"请输入一个有效的整数")
        return

    # 根据选择框输入的值,输出不同的结果
    if get_vselected == 1:
        result = f"双色球机选结果是:\n{result1}"
    elif get_vselected == 2:
        result = f"大乐透机选结果是:\n{result1}"

    # 显示结果
    result_text.config(state=tk.NORMAL)  # 允许修改输出框
    result_text.delete(1.0, tk.END)  # 清空输出框
    result_text.insert(tk.END, result)  # 显示结果
    result_text.config(state=tk.DISABLED)  # 禁止修改输出框

# 保存机选结果到本地的txt文件内
def save_result():
    # 创建一个文件对话框来选择文件保存的位置
    save_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text files", "*.txt")])

    if save_path:
        # 获取ScrolledText的内容
        content = result_text.get(1.0, tk.END)

        # 写入文件
        with open(save_path, "w") as file:
            file.write(content)

# 创建“清除”函数
def clear_result():
    # 允许修改输出框
    result_text.config(state=tk.NORMAL)
    # 定义清除文本的功能
    result_text.delete(1.0, tk.END)

# 创建Tkinter窗口
app = tk.Tk()
app.title("彩票机选工具")

# 设置窗口居中
window_width = 400
window_height = 550
screen_width = app.winfo_screenwidth()
screen_height = app.winfo_screenheight()
x = (screen_width - window_width) / 2
y = (screen_height - window_height) / 2
app.geometry('%dx%d+%d+%d' % (window_width, window_height, x, y))
app.resizable(width=False, height=False)

# 创建选择框容器
choose_frame = tk.Frame(app)
choose_frame.pack(pady=5)

# 创建左右选择框,设置默认值为1
choose = tk.IntVar(value=1)
radio1 = tk.Radiobutton(choose_frame, text="双色球机选", variable=choose, value=1)
radio1.pack(padx=10, pady=10, side=tk.LEFT)
radio2 = tk.Radiobutton(choose_frame, text="大乐透机选", variable=choose, value=2)
radio2.pack(padx=10, pady=10, side=tk.RIGHT)

# 创建输入框容器
entry_frame = tk.Frame(app)
entry_frame.pack(pady=5)
# 创建机选注数输入框
entry_label = tk.Label(entry_frame, text="请输入机选的注数:")
entry_label.pack(padx=5, pady=10, side=tk.LEFT)
number_entry = tk.Entry(entry_frame)
number_entry.pack(padx=5, pady=10, side=tk.RIGHT)

# 创建确认按钮
confirm_button = tk.Button(app, text="确认", font=('黑体', 15), command=run, width=5, height=1)
confirm_button.pack(pady=20)

# 创建输出框
result_label = tk.Label(app, text="机选结果:")
result_label.pack(pady=5)

result_text = scrolledtext.ScrolledText(app, width=50, height=18, wrap=tk.WORD, state=tk.DISABLED)
result_text.pack(pady=5)

# 创建按钮容器
result_frame = tk.Frame(app)
result_frame.pack(pady=5)

# 左边创建一个按钮来触发“保存”操作
save_button = tk.Button(result_frame, text="保存机选结果", font=('黑体', 15), command=save_result)
save_button.pack(padx=10, pady=10, side=tk.LEFT)

# 右边创建“清除”按钮并绑定到clear_result函数
clear_button = tk.Button(result_frame, text="清除", font=('黑体', 15), command=clear_result)
clear_button.pack(padx=10, pady=10, side=tk.RIGHT)

# 当前模块直接被执行
if __name__ == '__main__':
    # 开启主循环,让窗口处于显示状态
    app.mainloop()