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中使用tarfile压缩、解压tar归档文件示例
Apr 05 Python
使用Python编写提取日志中的中文的脚本的方法
Apr 30 Python
Python中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
利用python爬取软考试题之ip自动代理
Mar 28 Python
python中OrderedDict的使用方法详解
May 05 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
Feb 21 Python
python实现共轭梯度法
Jul 03 Python
python Dijkstra算法实现最短路径问题的方法
Sep 19 Python
tensorflow使用range_input_producer多线程读取数据实例
Jan 20 Python
python/golang 删除链表中的元素
Sep 14 Python
python判断字符串以什么结尾的实例方法
Sep 18 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
Dec 08 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 等比例缩放图片详解及实例代码
2016/09/18 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
大家未必知道的Js技巧收藏
2008/04/07 Javascript
IE 条件注释详解总结(附实例代码)
2009/08/29 Javascript
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
基于jquery.Jcrop的头像编辑器
2010/03/01 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
javascript 正则表达式相关应介绍
2012/11/27 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
基于vue2.0实现的级联选择器
2017/06/09 Javascript
Angular网络请求的封装方法
2018/05/22 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
createObjectURL方法实现本地图片预览
2019/09/30 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
原生javascript制作的拼图游戏实现方法详解
2020/02/23 Javascript
[03:51]吞吞映像 每周精彩击杀top10第二弹
2014/06/25 DOTA
利用Python查看目录中的文件示例详解
2017/08/28 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
香港时尚女装购物网站:ZAFUL
2017/07/19 全球购物
文员求职信
2014/07/15 职场文书
酒店辞职信怎么写
2015/02/27 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
初中政治教学反思
2016/02/23 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
Python预测分词的实现
2021/06/18 Python
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫