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写的Discuz7.2版faq.php注入漏洞工具
Aug 06 Python
Python获取某一天是星期几的方法示例
Jan 17 Python
使用python爬虫实现网络股票信息爬取的demo
Jan 05 Python
python3实现公众号每日定时发送日报和图片
Feb 24 Python
python训练数据时打乱训练数据与标签的两种方法小结
Nov 08 Python
python钉钉机器人运维脚本监控实例
Feb 20 Python
python scatter散点图用循环分类法加图例
Mar 19 Python
pandas取出重复数据的方法
Jul 04 Python
Python中面向对象你应该知道的一下知识
Jul 10 Python
python读取mysql数据绘制条形图
Mar 25 Python
Python3标准库之threading进程中管理并发操作方法
Mar 30 Python
python如何保存文本文件
Jun 07 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计算当前程序执行时间示例
2014/04/24 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2021/03/09 PHP
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
jQuery中[attribute!=value]选择器用法实例
2014/12/31 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
javascript针对cookie的基本操作实例详解
2015/11/30 Javascript
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
JS实现控制文本框的内容
2016/07/10 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
利用n工具轻松管理Node.js的版本
2017/04/21 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
[01:29:46]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第二局
2016/02/27 DOTA
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
Python脚本实现下载合并SAE日志
2015/02/10 Python
python中while循环语句用法简单实例
2015/05/07 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
2016/04/20 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
Hotels.com越南:酒店预订
2019/10/29 全球购物
经典广告词大全
2014/03/14 职场文书
文艺演出策划方案
2014/06/07 职场文书
企业法律事务工作总结
2015/08/11 职场文书
七年级英语教学反思
2016/02/15 职场文书
女性励志书籍推荐
2019/08/19 职场文书
golang 在windows中设置环境变量的操作
2021/04/29 Golang
SpringBoot连接MySQL获取数据写后端接口的操作方法
2021/11/02 MySQL
Win11如何修改dns?Win11修改dns图文教程
2022/01/18 数码科技
Python TypeError: ‘float‘ object is not subscriptable错误解决
2022/12/24 Python