python写一个随机点名软件的实例


Posted in Python onNovember 28, 2019

最近有个随机点名软件的需求,故写了一个,上代码: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)

效果如下:

python写一个随机点名软件的实例

以上这篇python写一个随机点名软件的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现问号表达式(?)的方法
Nov 27 Python
在Python中使用mongoengine操作MongoDB教程
Apr 24 Python
Python实现比较两个列表(list)范围
Jun 12 Python
Python 3.x 新特性及10大变化
Jun 12 Python
Python标准库之collections包的使用教程
Apr 27 Python
Django模板变量如何传递给外部js调用的方法小结
Jul 24 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
python3实现指定目录下文件sha256及文件大小统计
Feb 25 Python
python文本数据处理学习笔记详解
Jun 17 Python
pandas的相关系数与协方差实例
Dec 27 Python
python3 deque 双向队列创建与使用方法分析
Mar 24 Python
python 高阶函数简单介绍
Feb 19 Python
关于Python-faker的函数效果一览
Nov 28 #Python
python 监测内存和cpu的使用率实例
Nov 28 #Python
python随机生成库faker库api实例详解
Nov 28 #Python
python的faker库用法
Nov 28 #Python
关于python中plt.hist参数的使用详解
Nov 28 #Python
python创建子类的方法分析
Nov 28 #Python
python 实现快速生成连续、随机字母列表
Nov 28 #Python
You might like
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
使用php的HTTP请求的库Requests实现美女图片墙
2015/02/22 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
js类式继承的具体实现方法
2013/12/31 Javascript
NodeJS制作爬虫全过程
2014/12/22 NodeJs
JavaScript获取当前网页最后修改时间的方法
2015/04/03 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
Vue+Express实现登录状态权限验证的示例代码
2019/05/05 Javascript
vue实现文字加密功能
2019/09/27 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
Python函数式编程指南(三):迭代器详解
2015/06/24 Python
Python3字符串学习教程
2015/08/20 Python
详解Python文本操作相关模块
2017/06/22 Python
Python读csv文件去掉一列后再写入新的文件实例
2017/12/28 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
python得到电脑的开机时间方法
2018/10/15 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
golang/python实现归并排序实例代码
2020/08/30 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
应聘自荐信
2013/12/14 职场文书
岗位职责风险防控
2014/02/18 职场文书
产品包装策划方案
2014/05/18 职场文书
安全例会汇报材料
2014/08/23 职场文书
布达拉宫导游词
2015/02/02 职场文书
2015年行政人事部工作总结
2015/05/13 职场文书
装修安全责任协议书
2016/03/22 职场文书
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS