随机抽取代码公布

2023/09/03 IT 共 3215 字,约 10 分钟

前言:

前人栽树,后人乘凉

当听到我制作的一个小小的随机抽取程序仍然在五班被广泛运用并且被给予较高评价时(例如:你他吗的为什么要做这个东西啊,太捏吗吓人了吧),我是感到非常欣慰。

但是考虑到即便我心在五班,身却必须留在九班,所以我想为了能调动群众智慧改进程序,在该页面公布该程序的代码——虽然一直是公开的,只是访问门槛比较高。

程序运行原理:在执行后先执行rand函数,在rand函数中首先调用atmosphere函数,以起到滚动数字营造氛围的效果——只是营造氛围。之后再随机抽取一个数字并展示,作为最终结果。

下面是对重要步骤的说明:

控件(按钮)的设置

group_btn = tk.Button(root, text="抽取小组", font=(
    '微软雅黑', 16), bg='#63B8FF', fg='#FFFFFF', command=lambda: rand('group'))
person_btn = tk.Button(root, text="抽取个人", font=(
    '微软雅黑', 16), bg='#63B8FF', fg='#FFFFFF', command=lambda: rand('student'))

rand()函数

def rand(s): #“随机”抽取
    global n
    t = 0
    atmosphere(s)
    if s == 'group':
        final_label.config(text=rd.randint(1, 8))
    else:
        final_label.config(text=rd.randint(1,44)) #这里的人数应当修改

atmosphere()函数

def atmosphere(s):    #滚动数字,氛围组
    if s == 'group':
        ending = 8
    else:
        ending = 44 #现在好像变成三十几人了,可以修改一下
    #逐渐减缓滚动速度
    for i in range(20):
        final_label.config(text=rd.randint(1,ending))
        final_label.update()
        time.sleep(0.05)
    for i in range(10):
        final_label.config(text=rd.randint(1,ending))
        final_label.update()
        time.sleep(0.1)
    for i in range(10):
        final_label.config(text=rd.randint(1,ending))
        final_label.update()
        time.sleep(0.2)

拓展

前言

此部分仅用作学习交流使用,一切不负责行为均与本人无关。不存在任何金钱交易

设置无法抽到指定学号(组号)

首先要在rand(s)函数中设置充满学号的数组。在此以循环录入学号为例,这会让程序运行次数增加,但总体时间复杂度仍为O(n),不存在特别严重的影响。

for i in range(1,44):
    if i == 7 or i == 8: #以7,8号为例
        continue #不录入数组
    a[i] = i

无须对atmosphere()函数进行变更,因为它只是氛围组

需要在rand()函数中加入:

rd.shuffle(a[i]) #打乱数组中元素排序。

接着,由于最终结果由final_label控件呈现,所以要进行修改:

final_label.config(text=a[1])

这样随机数功能仍在,但数组内本就不具有指定学号,自然不用担心最终结果有问题。

修改后rand()函数为:

def rand(s):
    global n
    t = 0
    atmosphere(s)
    if s == 'group':
        final_label.config(text=rd.randint(1,8))
    else:
        a = []
        for i in range(1,44):#修改为总学号
            if i == 7 or i == 8:
                continue
            a.append(i)
        rd.shuffle(a)
        final_label.config(text=a[1])

将修改后的rand()函数覆盖未修改的rand()函数即可正常运行。

生动性

可以使用pygame库,在点击时播放相关音效。但考虑到教室电脑不具备安装第三方库的条件,在此不做说明。

全部代码:

import tkinter as tk
import random as rd
import time
root = tk.Tk()
root.title("随机抽取")
root.geometry('600x700')
root.resizable(False, False)
root.configure(bg='#FFFFFF')

n = 0 

def atmosphere(s):    #滚动数字,氛围组
    if s == 'group':
        ending = 8
    else:
        ending = 44
    #逐渐减缓滚动速度
    for i in range(20):
        final_label.config(text=rd.randint(1,ending))
        final_label.update()
        time.sleep(0.05)
    for i in range(10):
        final_label.config(text=rd.randint(1,ending))
        final_label.update()
        time.sleep(0.1)
    for i in range(10):
        final_label.config(text=rd.randint(1,ending))
        final_label.update()
        time.sleep(0.2)


def rand(s): #“随机”抽取
    global n
    t = 0
    atmosphere(s)
    if s == 'group':
        final_label.config(text=rd.randint(1, 8))
    else:
        final_label.config(text=rd.randint(1,44))


#初始化控件
title_label = tk.Label(root, text='随机抽取', font=('微软雅黑', 20), bg='#FFFFFF')
title_label.pack(pady=50)

final_label = tk.Label(root, text='waiting……', font=(
    '微软雅黑', 50), foreground='white', background='red')
final_label.pack(pady=20)

group_btn = tk.Button(root, text="抽取小组", font=(
    '微软雅黑', 16), bg='#63B8FF', fg='#FFFFFF', command=lambda: rand('group'))
group_btn.place(relx=0.5, rely=0.5, anchor='center')
group_btn.bind("<Enter>", lambda event: group_btn.config(bg='#4D7DAA'))
group_btn.bind("<Leave>", lambda event: group_btn.config(bg='#63B8FF'))

person_btn = tk.Button(root, text="抽取个人", font=(
    '微软雅黑', 16), bg='#63B8FF', fg='#FFFFFF', command=lambda: rand('student'))
person_btn.place(relx=0.5, rely=0.6, anchor='center')
person_btn.bind("<Enter>", lambda event: person_btn.config(bg='#4D7DAA'))
person_btn.bind("<Leave>", lambda event: person_btn.config(bg='#63B8FF'))


root.mainloop()

文档信息

Search

    Table of Contents