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 相关文章推荐
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
在Python中操作字典之update()方法的使用
May 22 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
Python编程实现二叉树及七种遍历方法详解
Jun 02 Python
python 正确保留多位小数的实例
Jul 16 Python
python数据批量写入ScrolledText的优化方法
Oct 11 Python
python 将json数据提取转化为txt的方法
Oct 26 Python
python读写csv文件并增加行列的实例代码
Aug 01 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
python属于解释语言吗
Jun 11 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
Dec 11 Python
python爬虫scrapy框架的梨视频案例解析
Feb 20 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/08/09 PHP
Yii中的relations数据关联查询及统计功能用法详解
2016/07/14 PHP
对于this和$(this)的个人理解
2013/09/08 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
jQuery模拟点击A标记示例参考
2014/04/17 Javascript
jQuery制作拼图小游戏
2015/01/12 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
JavaScript点击按钮后弹出透明浮动层的方法
2015/05/11 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
AngularJs实现分页功能不带省略号的代码
2016/05/30 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
vue-cli中的webpack配置详解
2017/09/25 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
js类的继承定义与用法分析
2019/06/21 Javascript
详解Vue中CSS样式穿透问题
2019/09/12 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
浅析Python与Mongodb数据库之间的操作方法
2019/07/01 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
python orm 框架中sqlalchemy用法实例详解
2020/02/02 Python
pycharm中leetcode插件使用图文详解
2020/12/07 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
党员党性分析材料
2014/02/17 职场文书
廉洁使者实施方案
2014/03/29 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
创业计划书介绍
2019/04/24 职场文书
500字作文之难忘的同学
2019/12/20 职场文书