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正则表达式分组概念与用法详解
Jun 24 Python
Django模板变量如何传递给外部js调用的方法小结
Jul 24 Python
Python实现定时精度可调节的定时器
Apr 15 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
python linecache 处理固定格式文本数据的方法
Jan 08 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
Jan 30 Python
Python XlsxWriter模块Chart类用法实例分析
Mar 11 Python
python如何实现复制目录到指定目录
Feb 13 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
Jun 10 Python
python对一个数向上取整的实例方法
Jun 18 Python
python 调用API接口 获取和解析 Json数据
Sep 28 Python
python如何控制进程或者线程的个数
Oct 16 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中通过smtp发邮件的类,测试通过
2007/01/22 PHP
在PHP里得到前天和昨天的日期的代码
2007/08/16 PHP
修改WordPress中文章编辑器的样式的方法详解
2015/12/15 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
关于Javascript中document.cookie的使用
2017/03/08 Javascript
ES6关于Promise的用法详解
2018/05/07 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
2019/07/16 Javascript
详解如何在Vue项目中发送jsonp请求
2019/10/25 Javascript
js编写简易的计算器
2020/07/29 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
python模拟鼠标拖动操作的方法
2015/03/11 Python
在Django中创建URLconf相关的通用视图的方法
2015/07/20 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
Python3.6 Schedule模块定时任务(实例讲解)
2017/11/09 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
2018/02/07 Python
python绘制立方体的方法
2018/07/02 Python
详解python列表(list)的使用技巧及高级操作
2019/08/15 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
维珍澳洲航空官网:Virgin Australia
2017/09/08 全球购物
植村秀美国官网:Shu Uemura美国
2019/03/19 全球购物
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
澳大利亚商务邀请函
2014/01/17 职场文书
元宵晚会主持词
2014/03/25 职场文书
数学教研活动总结
2014/07/02 职场文书
学生抄袭作业的检讨书
2014/10/02 职场文书