python写一个随机点名软件

最近有个随机点名软件的需求,故写了一个,上代码:github地址

# -*- coding: utf-8 -*-
# @Time    : 18-12-31 下午4:21
# @Author  : Felix Wang

from tkinter import *
import tkinter.font as tkFont
import random
import gc
import os, sys
import chardet
import copy
from threading import Thread
import time

def resource_path(relative):
    """
    图片路径
    :param relative:
    :return:
    """
    if hasattr(sys, "_MEIPASS"):
        return os.path.join(sys._MEIPASS, relative)
    return os.path.join(relative)

def center_window(root, width, height):
    """
    中心大小
    :param root: tk对象
    :param width:
    :param height:
    :return:
    """
    screenwidth = root.winfo_screenwidth()
    screenheight = root.winfo_screenheight()
    size = ‘%dx%d+%d+%d‘ % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
    root.geometry(size)

def clear():
    lb.delete(0, END)

def get_names():
    names = []
    name_path = os.path.join(BASE_DIR, ‘name.txt‘)
    with open(name_path, ‘rb‘) as f:
        data = f.read()
        cod = chardet.detect(data)[‘encoding‘]
        if ‘gb‘ in str(cod):
            cod = ‘gbk‘
        for name in data.decode(cod).strip().split(‘\n‘):
            if name.strip():
                names.append(name.strip())
        return names

class MyThread(Thread):
    def __init__(self):
        self.ifdo = False
        self.auto_choise = False
        self.is_auto = -1
        super().__init__()

    def run(self):
        while True:
            if self.is_auto is True:
                while self.ifdo:
                    index = random.randint(0, len(names) - 1)
                    echo["text"] = names[index]
                    root.update_idletasks()
                    time.sleep(1 / 23 - 0.003)
                self.is_auto = -1
            elif self.is_auto is False:
                if self.auto_choise:
                    self.auto()
                    self.is_auto = -1
            time.sleep(0.1)

    def stop(self):
        """
        手动抽奖时点击停止按钮时的操作
        :return:
        """
        if self.is_auto:
            self.ifdo = False
            button2["text"] = ‘手动抽奖‘
            pict[‘image‘] = huaji_gif
            _name = random.choice(names)
            echo["text"] = _name
            lb.insert(END, _name)
            root.update_idletasks()
            root.update()
            for x in locals().keys():
                del locals()[x]
            gc.collect()
            pict[‘image‘] = huaji_gif
            scrolly.update()

    def go(self):
        """
        手动开始时的停止标记
        :return:
        """
        if self.is_auto == -1:
            self.is_auto = True
            self.ifdo = True
            pict["image"] = huang_gif
            button2["text"] = ‘点击停止‘

    def auto_start(self):
        """
        自动开始设置更改标记
        :return:
        """
        if self.is_auto == -1:
            self.is_auto = False
            self.auto_choise = True
            pict["image"] = huang_gif
            button["text"] = ‘先别点我‘
            global ft1
            ft1 = tkFont.Font(family=‘Fixdsys‘, size=80, weight=tkFont.BOLD)

    def auto(self):
        """
        自动开始时执行的操作
        :return:
        """
        copy_names = copy.deepcopy(names)
        ren = int(v.get())
        for i in range(ren):
            for a in range(23):
                index = random.randint(0, len(names) - 1)
                echo["text"] = random.choice(names)
                root.update_idletasks()
                time.sleep(1 / 23 - 0.003)

            choise_name = copy_names.pop(random.choice(range(len(copy_names))))
            echo["text"] = choise_name

            lb.insert(END, choise_name)
            if i == ren - 1:
                pict[‘image‘] = huaji_gif
                button["text"] = ‘开始抽奖‘
            for a in range(5):
                root.update()
                time.sleep(0.06)

        root.update_idletasks()

        for x in locals().keys():
            del locals()[x]
        gc.collect()

        scrolly.update()
        self.auto_choise = False

flag = False

def name2():
    global flag
    flag = not flag

    if flag:
        tr.go()
    else:
        tr.stop()

def name():
    tr.auto_start()

try:
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))

    names = get_names()

    root = Tk()

    root.title("随机抽奖器(by 王以涛)")

    center_window(root, 570, 160)

    ft = tkFont.Font(family=‘Fixdsys‘, size=40, weight=tkFont.BOLD)
    ft1 = tkFont.Font(family=‘Fixdsys‘, size=80, weight=tkFont.BOLD)
    echo = Label(root, text=‘随机抽奖‘, font=ft, width=8)  # 默认显示
    echo.grid(row=1, column=1, columnspan=2)

    scrolly = Scrollbar(root)
    scrolly.grid(row=1, column=5, rowspan=2, ipady=30)
    lb = Listbox(root, yscrollcommand=scrolly.set, exportselection=False, height=6)
    lb.grid(row=1, column=3, rowspan=2, columnspan=2, pady=0)
    scrolly[‘command‘] = lb.yview

    # button = Button(root, text=‘删除所选名字‘, command=lambda x=lb: x.delete(ACTIVE))
    # button.grid(row=3, column=3)
    button = Button(root, text=‘删除所有名字‘, command=clear)
    button.grid(row=3, column=4)

    v = StringVar()
    Scale(root, from_=1, to=len(names), resolution=1, orient=HORIZONTAL, variable=v).grid(row=2, column=1, columnspan=2)

    # 抽奖时的图片
    data_dir = os.path.join(BASE_DIR, "img")
    huaji_gif = PhotoImage(file=resource_path(os.path.join(data_dir, ‘huaji.gif‘)))
    huang_gif = PhotoImage(file=resource_path(os.path.join(data_dir, ‘huang.gif‘)))
    pict = Label(root, image=huaji_gif)
    pict.grid(row=1, column=0, rowspan=3)

    button = Button(root, text=‘自动抽奖‘, command=name)
    button.grid(row=3, column=1, columnspan=1)
    flag = False

    button2 = Button(root, text=‘手动抽奖‘, command=name2)
    button2.grid(row=3, column=2, columnspan=1)

    tr = MyThread()
    tr.setDaemon(True)
    tr.start()

    root.mainloop()
except Exception as e:
    print(‘错误信息‘, e)
    time.sleep(60)

效果如下:

原文地址:https://www.cnblogs.com/felixwang2/p/10206820.html

时间: 2024-09-30 11:24:33

python写一个随机点名软件的相关文章

十行代码--用python写一个USB病毒 (知乎 DeepWeaver)

昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想,比如,当一个usb插入时,在后台自动把usb里的重要文件神不知鬼不觉地拷贝到本地或者上传到某个服务器,就需要特殊的软件辅助. 于是我心想,能不能用python写一个程序,让它在后台运行.每当有u盘插入的时候,就自动拷贝其中重要文件. 如何判断U盘的插入与否? 首先我们打开电脑终端,进入/Volume

用C语言编写一个随机点名系统

/*编写一个随机点名系统,运行该系统后,按空格键可以显示出一名同学,以前被选中的同学,将不会再次被选中*/ #include<stdio.h> #include <stdlib.h> #include<string.h> #include <conio.h> #include <time.h> struct studentinfo { char sNo[5]; char sxueNo[14]; char sname[20]; }st[100];

用Python写一个ftp下载脚本

用Python写一个ftp下载脚本 ----基于Red Hat Enterprise Linux Server release 6.4 (Santiago):python 2.6.6 Ps:少侠我接触Python半个月以来接到的第一个需求,虽然如此简单的一个脚本,少侠我磕磕绊绊却用了将近一天半的时间才写出来,但还是很开心,毕竟也粗来了,废话不多说,切入正题.因为一开始没有用过ftplib模块,所以各种谷歌度娘一堆资料杂乱不堪,话不清,理不乱的,本文实现的功能简单,下面介绍一下,以免误导读者. 需

写一个随机洗牌函数——概率题

题目描述: 写一个随机洗牌函数.要求洗出的52!种组合都是等概率的. 也就是你洗出的一种组合的概率是1/(52!).假设已经给你一个完美的随机数发生器. 解题思路: 这是一道概率题 随机洗牌,目的是要做到随机性,要求每一张牌出现的概率要相等. 我们常用的普通扑克牌54张,要做到每张牌出现的概率是1/(54!), 抽第一张牌概率:1/54: 抽第二张牌概率:1/53: 抽第三张牌概率:1/52: -- 一直这样随机地拿下去直到拿完最后1张,我们就从52!种可能中取出了一种排列, 这个排列对应的概率

老男孩教育每日一题-2017-04-17:使用Shell或Python写一个脚本,CPU使用率超过80%或硬盘超过85%邮件报警

老男孩教育每日一题-2017-04-17: 使用Shell或Python写一个脚本,CPU使用率超过80%或硬盘超过85%邮件报警. 今天是老男孩教育每日一题陪伴大家的第29天.

python写一个脚本解析文件

Python写一个脚本解析文件 ----基于Red Hat Enterprise Linux Server release 6.4 (Santiago):python 2.6.6 需求: 1.去掉空行 2.去掉空行后输出到一个新文件 附加需求(排版):1.'-'缩进n个字符 '-'缩进2n个字符 以此类推 2.'-'开头的所有句子输出在一行 '-'开头的句子输出在一行 以此类推 --------------------------------------------分隔线------------

python写一个通讯录V2.0

python写一个通讯录step by step V2.0 引用知识 list + dict用于临时存储用户数据信息 cPickle用于格式化文件存取 依旧使用file来进行文件的存储 解决问题 1.操刀开始去做 原始代码 实现功能(可做模板) 1.判断输入内容是否在给出的menu目录内,在的话,返回对应结果,不在就报错 2.调用os模块的exit功能 3.字典配合循环加上函数实现switch的功能 #!/usr/bin/env python #coding:utf8 #Author:zhuim

[py]python写一个通讯录step by step V3.0

python写一个通讯录step by step V3.0 参考: http://blog.51cto.com/lovelace/1631831 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数.字典.模块调用 注意问题: 1.更优美的格式化输出 2.把日期换算成年龄 3.更新操作做的更优雅 准备工作 db准备 - 创建数据库 mysql> create database txl charset utf8; Query OK, 1 row affecte

python写一个通讯录

闲着没事,用python写一个模拟通讯录,要求要实现常用的通讯录的功能,基本流程如下 ? 接下来就按照这个流程实现各个模块的功能 1. 定义一个类,并初始化 1 import json 2 import time 3 4 5 class Address(object): 6 def __init__(self): 7 with open("通讯录.txt", 'r', encoding='utf-8') as f: 8 self.data = json.loads(f.read())