【PythonGui实战】自动摇号小程序

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972

个人介绍: 研二|统计学|干货分享
         擅长Python、Matlab、R等主流编程软件
         累计十余项国家级比赛奖项,参与研究经费10w、50w级横向

文章目录

  • [1 功能简介](#1 功能简介)
  • [2 操作界面](#2 操作界面)
  • [3 主要修改位置点](#3 主要修改位置点)
  • [4 完整代码](#4 完整代码)

该篇文章利用Python代码实现了一个功能完备、用户友好的抽奖系统,通过图形界面允许用户启动、结束和重置抽奖流程,并在后台线程中高效地生成和显示中奖号码,同时提供可修改位置和完整代码。

1 功能简介

该代码实现了一个基于Tkinter图形用户界面的Python抽奖系统。系统的主要功能和特点如下:

  1. 用户界面:使用Tkinter库创建了一个窗口,窗口标题为"PythonGui抽奖系统",尺寸为800x400像素。界面上包含一个用于显示当前状态或中奖号码的标签(初始显示为"未开始摇号"),以及三个按钮:"开始"、"结束"和"重置"。
  2. 抽奖流程
    • 开始:点击"开始"按钮启动抽奖流程。此时,"开始"按钮被禁用,"结束"按钮变为可用,同时"重置"按钮被禁用。抽奖号码的生成在一个独立的线程中进行,以避免阻塞主线程(即用户界面线程)。
    • 生成号码:在抽奖过程中,系统会在一个循环中不断生成一个1到135之间的随机整数作为潜在的中奖号码,并每0.1秒更新一次界面上显示的号码。
    • 结束:点击"结束"按钮停止抽奖流程。此时,当前显示的号码被确定为中奖号码,界面上的"开始"按钮重新变为可用,"结束"按钮被禁用,同时"重置"按钮变为可用。抽奖线程也会被正确地终止。
    • 重置:点击"重置"按钮会将系统恢复到初始状态,即显示"未开始摇号",并禁用"开始"和"重置"按钮(启用"开始"按钮以便再次启动抽奖)。
  3. 线程处理 :抽奖号码的生成和更新是在一个单独的线程中进行的,这样确保了用户界面的响应性。通过线程间的通信(使用root.after方法在Tkinter线程中安全地更新标签),实现了从后台线程更新用户界面。
  4. 用户界面更新 :系统提供了两种更新标签的方法:update_label_with_text用于直接设置标签的文本和颜色,而update_label则专门用于从后台线程更新标签上的数字(中奖号码)。

2 操作界面

运行代码后,将弹出界面:

点击开始按钮后,随机生成设置范围内的抽奖数字,并不断随机变化:

点击结束后,固定生成数字:

点击重置,界面返回到初始状态:

3 主要修改位置点

List1:软件界面名字

List2:软件界面大小

List3:摇号范围

初始设置为1-135。

List4:摇号刷新速度

初始设置为每0.1s刷新一次。

4 完整代码

复制代码
import tkinter as tk
import random
import threading
import time

class LotteryApp:
    def __init__(self, root):
        self.root = root
        self.root.title("PythonGui抽奖系统")
        self.root.geometry("800x400")

        self.label = tk.Label(root, text="未开始摇号", font=("Arial", 70), fg="black")  # 初始颜色设为黑色
        self.label.pack(pady=20)

        self.start_button = tk.Button(root, text="开始", command=self.start_lottery, font=("Arial", 30))
        self.start_button.pack(side=tk.LEFT, padx=20)

        self.end_button = tk.Button(root, text="结束", command=self.end_lottery, font=("Arial", 30))
        self.end_button.pack(side=tk.RIGHT, padx=20)

        self.reset_button = tk.Button(root, text="重置", command=self.reset_app, font=("Arial", 30))
        self.reset_button.pack(side=tk.RIGHT, padx=5)  # 调整padx以控制按钮之间的间距

        self.running = False
        self.lottery_number = None
        self.lottery_thread = None

    def start_lottery(self):
        if not self.running:
            self.running = True
            self.start_button.config(state=tk.DISABLED)
            self.end_button.config(state=tk.NORMAL)
            self.reset_button.config(state=tk.DISABLED)
            self.lottery_thread = threading.Thread(target=self.generate_lottery_number)
            self.lottery_thread.start()

    def end_lottery(self):
        self.running = False
        self.start_button.config(state=tk.NORMAL)
        self.end_button.config(state=tk.DISABLED)
        self.reset_button.config(state=tk.NORMAL)
        if self.lottery_thread:
            self.lottery_thread.join()
        self.update_label_with_text(f"中奖号码: {self.lottery_number}")

    def reset_app(self):
        self.running = False
        if self.lottery_thread:
            self.lottery_thread.join()  # 虽然在这个例子中线程可能已经因为running=False而结束了,但加上这一行更保险
        self.start_button.config(state=tk.NORMAL)
        self.end_button.config(state=tk.DISABLED)
        self.reset_button.config(state=tk.DISABLED)
        self.update_label_with_text("未开始摇号", "black")  # 传递黑色作为颜色参数
        self.lottery_number = None  # 重置随机数

    def generate_lottery_number(self):
        while self.running:
            self.lottery_number = random.randint(1,135)
            self.update_label_from_thread(self.lottery_number)
            time.sleep(0.1)

    def update_label_from_thread(self, number):
        self.root.after(0, self.update_label, number)

    def update_label_with_text(self, text, color="red"):
        # 专门用于更新标签文本和颜色的方法
        self.label.config(text=text, font=("Arial", 70), fg=color)

    def update_label(self, number):
        # 这个方法现在只被update_label_from_thread调用,并且只处理数字更新
        self.update_label_with_text(f"中奖号码: {number}")

if __name__ == "__main__":
    root = tk.Tk()
    app = LotteryApp(root)
    root.mainloop()
相关推荐
XiaoMu_0012 分钟前
基于Python+Streamlit的旅游数据分析与预测系统:从数据可视化到机器学习预测的完整实现
python·信息可视化·旅游
THMAIL4 分钟前
深度学习从入门到精通 - 生成对抗网络(GAN)实战:创造逼真图像的魔法艺术
人工智能·python·深度学习·神经网络·机器学习·生成对抗网络·cnn
bkspiderx34 分钟前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
我没想到原来他们都是一堆坏人1 小时前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python
中华小当家呐2 小时前
算法之常见八大排序
数据结构·算法·排序算法
总有刁民想爱朕ha2 小时前
车牌模拟生成器:Python3.8+Opencv代码实现与商业应用前景(C#、python 开发包SDK)
开发语言·python·数据挖掘
沐怡旸2 小时前
【算法--链表】114.二叉树展开为链表--通俗讲解
算法·面试
一只懒洋洋3 小时前
K-meas 聚类、KNN算法、决策树、随机森林
算法·决策树·聚类
人衣aoa3 小时前
Python编程基础(八) | 类
开发语言·python
大模型真好玩3 小时前
深入浅出LangGraph AI Agent智能体开发教程(四)—LangGraph全生态开发工具使用与智能体部署
人工智能·python·mcp