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开发windows GUI程序入门实例
Oct 23 Python
python实现文本去重且不打乱原本顺序
Jan 26 Python
Python实现字符串格式化的方法小结
Feb 20 Python
python3.0 模拟用户登录,三次错误锁定的实例
Nov 02 Python
pandas.loc 选取指定列进行操作的实例
May 18 Python
让Django支持Sql Server作后端数据库的方法
May 29 Python
python hbase读取数据发送kafka的方法
Dec 27 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
May 13 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
matplotlib 对坐标的控制,加图例注释的操作
Apr 17 Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 Python
Python RabbitMQ实现简单的进程间通信示例
Jul 02 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函数代码
2010/04/22 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
php验证码实现代码(3种)
2015/09/07 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
2015/10/08 PHP
JS 自动安装exe程序
2008/11/30 Javascript
javascript 限制输入脚本大全
2009/11/03 Javascript
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
jquery实现excel导出的方法
2013/04/04 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
jquery prop的使用介绍及与attr的区别
2013/12/19 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
JavaScript中利用for循环遍历数组
2017/01/15 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
浅析vue.js数组的变异方法
2018/06/30 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
最近Python有点火? 给你7个学习它的理由!
2017/06/26 Python
python使用xpath中遇到:到底是什么?
2018/01/04 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
Python实现查询某个目录下修改时间最新的文件示例
2018/08/29 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
Python第三方库face_recognition在windows上的安装过程
2019/05/03 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
Django 静态文件配置过程详解
2019/07/23 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
物流合作计划书
2014/01/10 职场文书
2014年创先争优活动总结
2014/05/04 职场文书
模范班主任事迹材料
2014/12/17 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书