最近有个随机点名软件的需求,故写了一个,上代码:github地址

  1. # -*- coding: utf-8 -*-
  2. # @Time : 18-12-31 下午4:21
  3. # @Author : Felix Wang
  4.  
  5. from tkinter import *
  6. import tkinter.font as tkFont
  7. import random
  8. import gc
  9. import os, sys
  10. import chardet
  11. import copy
  12. from threading import Thread
  13. import time
  14.  
  15. def resource_path(relative):
  16. """
  17. 图片路径
  18. :param relative:
  19. :return:
  20. """
  21. if hasattr(sys, "_MEIPASS"):
  22. return os.path.join(sys._MEIPASS, relative)
  23. return os.path.join(relative)
  24.  
  25. def center_window(root, width, height):
  26. """
  27. 中心大小
  28. :param root: tk对象
  29. :param width:
  30. :param height:
  31. :return:
  32. """
  33. screenwidth = root.winfo_screenwidth()
  34. screenheight = root.winfo_screenheight()
  35. size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
  36. root.geometry(size)
  37.  
  38. def clear():
  39. lb.delete(0, END)
  40.  
  41. def get_names():
  42. names = []
  43. name_path = os.path.join(BASE_DIR, 'name.txt')
  44. with open(name_path, 'rb') as f:
  45. data = f.read()
  46. cod = chardet.detect(data)['encoding']
  47. if 'gb' in str(cod):
  48. cod = 'gbk'
  49. for name in data.decode(cod).strip().split('\n'):
  50. if name.strip():
  51. names.append(name.strip())
  52. return names
  53.  
  54. class MyThread(Thread):
  55. def __init__(self):
  56. self.ifdo = False
  57. self.auto_choise = False
  58. self.is_auto = -1
  59. super().__init__()
  60.  
  61. def run(self):
  62. while True:
  63. if self.is_auto is True:
  64. while self.ifdo:
  65. index = random.randint(0, len(names) - 1)
  66. echo["text"] = names[index]
  67. root.update_idletasks()
  68. time.sleep(1 / 23 - 0.003)
  69. self.is_auto = -1
  70. elif self.is_auto is False:
  71. if self.auto_choise:
  72. self.auto()
  73. self.is_auto = -1
  74. time.sleep(0.1)
  75.  
  76. def stop(self):
  77. """
  78. 手动抽奖时点击停止按钮时的操作
  79. :return:
  80. """
  81. if self.is_auto:
  82. self.ifdo = False
  83. button2["text"] = '手动抽奖'
  84. pict['image'] = huaji_gif
  85. _name = random.choice(names)
  86. echo["text"] = _name
  87. lb.insert(END, _name)
  88. root.update_idletasks()
  89. root.update()
  90. for x in locals().keys():
  91. del locals()[x]
  92. gc.collect()
  93. pict['image'] = huaji_gif
  94. scrolly.update()
  95.  
  96. def go(self):
  97. """
  98. 手动开始时的停止标记
  99. :return:
  100. """
  101. if self.is_auto == -1:
  102. self.is_auto = True
  103. self.ifdo = True
  104. pict["image"] = huang_gif
  105. button2["text"] = '点击停止'
  106.  
  107. def auto_start(self):
  108. """
  109. 自动开始设置更改标记
  110. :return:
  111. """
  112. if self.is_auto == -1:
  113. self.is_auto = False
  114. self.auto_choise = True
  115. pict["image"] = huang_gif
  116. button["text"] = '先别点我'
  117. global ft1
  118. ft1 = tkFont.Font(family='Fixdsys', size=80, weight=tkFont.BOLD)
  119.  
  120. def auto(self):
  121. """
  122. 自动开始时执行的操作
  123. :return:
  124. """
  125. copy_names = copy.deepcopy(names)
  126. ren = int(v.get())
  127. for i in range(ren):
  128. for a in range(23):
  129. index = random.randint(0, len(names) - 1)
  130. echo["text"] = random.choice(names)
  131. root.update_idletasks()
  132. time.sleep(1 / 23 - 0.003)
  133.  
  134. choise_name = copy_names.pop(random.choice(range(len(copy_names))))
  135. echo["text"] = choise_name
  136.  
  137. lb.insert(END, choise_name)
  138. if i == ren - 1:
  139. pict['image'] = huaji_gif
  140. button["text"] = '开始抽奖'
  141. for a in range(5):
  142. root.update()
  143. time.sleep(0.06)
  144.  
  145. root.update_idletasks()
  146.  
  147. for x in locals().keys():
  148. del locals()[x]
  149. gc.collect()
  150.  
  151. scrolly.update()
  152. self.auto_choise = False
  153.  
  154. flag = False
  155.  
  156. def name2():
  157. global flag
  158. flag = not flag
  159.  
  160. if flag:
  161. tr.go()
  162. else:
  163. tr.stop()
  164.  
  165. def name():
  166. tr.auto_start()
  167.  
  168. try:
  169. BASE_DIR = os.path.dirname(os.path.abspath(__file__))
  170.  
  171. names = get_names()
  172.  
  173. root = Tk()
  174.  
  175. root.title("随机抽奖器(by 王以涛)")
  176.  
  177. center_window(root, 570, 160)
  178.  
  179. ft = tkFont.Font(family='Fixdsys', size=40, weight=tkFont.BOLD)
  180. ft1 = tkFont.Font(family='Fixdsys', size=80, weight=tkFont.BOLD)
  181. echo = Label(root, text='随机抽奖', font=ft, width=8) # 默认显示
  182. echo.grid(row=1, column=1, columnspan=2)
  183.  
  184. scrolly = Scrollbar(root)
  185. scrolly.grid(row=1, column=5, rowspan=2, ipady=30)
  186. lb = Listbox(root, yscrollcommand=scrolly.set, exportselection=False, height=6)
  187. lb.grid(row=1, column=3, rowspan=2, columnspan=2, pady=0)
  188. scrolly['command'] = lb.yview
  189.  
  190. # button = Button(root, text='删除所选名字', command=lambda x=lb: x.delete(ACTIVE))
  191. # button.grid(row=3, column=3)
  192. button = Button(root, text='删除所有名字', command=clear)
  193. button.grid(row=3, column=4)
  194.  
  195. v = StringVar()
  196. Scale(root, from_=1, to=len(names), resolution=1, orient=HORIZONTAL, variable=v).grid(row=2, column=1, columnspan=2)
  197.  
  198. # 抽奖时的图片
  199. data_dir = os.path.join(BASE_DIR, "img")
  200. huaji_gif = PhotoImage(file=resource_path(os.path.join(data_dir, 'huaji.gif')))
  201. huang_gif = PhotoImage(file=resource_path(os.path.join(data_dir, 'huang.gif')))
  202. pict = Label(root, image=huaji_gif)
  203. pict.grid(row=1, column=0, rowspan=3)
  204.  
  205. button = Button(root, text='自动抽奖', command=name)
  206. button.grid(row=3, column=1, columnspan=1)
  207. flag = False
  208.  
  209. button2 = Button(root, text='手动抽奖', command=name2)
  210. button2.grid(row=3, column=2, columnspan=1)
  211.  
  212. tr = MyThread()
  213. tr.setDaemon(True)
  214. tr.start()
  215.  
  216. root.mainloop()
  217. except Exception as e:
  218. print('错误信息', e)
  219. time.sleep(60)

效果如下:

python写一个随机点名软件的更多相关文章

  1. 用Python写一个随机数字生成代码,5行代码超简单

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 第一步,安装 random 库 random库是使用随机数的Python标准库 ...

  2. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  3. 十行代码--用python写一个USB病毒 (知乎 DeepWeaver)

    昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想, ...

  4. 【Python】如何基于Python写一个TCP反向连接后门

    首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...

  5. Python写一个自动点餐程序

    Python写一个自动点餐程序 为什么要写这个 公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘记,或者是在地铁/公交上没办法点餐,所以总是没饭吃,只有 ...

  6. python写一个能变身电光耗子的贪吃蛇

    python写一个不同的贪吃蛇 写这篇文章是因为最近课太多,没有精力去挖洞,记录一下学习中的收获,python那么好玩就写一个大一没有完成的贪吃蛇(主要还是跟课程有关o(╥﹏╥)o,课太多好烦) 第一 ...

  7. [py]python写一个通讯录step by step V3.0

    python写一个通讯录step by step V3.0 参考: http://blog.51cto.com/lovelace/1631831 更新功能: 数据库进行数据存入和读取操作 字典配合函数 ...

  8. #写一个随机产生138开头手机号的程序 1.输入一个数量,产生xx条手机号 2.产生的这些手机号不能重复

    import randomcount=int(input('请输入你所想要手机号数量:'))prefix='138'for i in range(count): num=random.sample(r ...

  9. 用python写一个自动化盲注脚本

    前言 当我们进行SQL注入攻击时,当发现无法进行union注入或者报错等注入,那么,就需要考虑盲注了,当我们进行盲注时,需要通过页面的反馈(布尔盲注)或者相应时间(时间盲注),来一个字符一个字符的进行 ...

随机推荐

  1. cefsharp System.IO.FileNotFoundException: 未能加载文件或程序集“CefSharp.Core.dll”或它的某一个依赖项。

    解决办法 安装vc++ 2015 Redistributable 64位系统安装x64 如果还报错先装x64版本再装x86版本 https://files.cnblogs.com/files/xuej ...

  2. gcc 编译控制选项

    gcc 编译控制选项前面已经讲过, gcc 的基本用法是:$ gcc [选项] [文件名]gcc 有很多编译控制选项,使得 gcc 可以根据不同的参数进行不同的编译处理,可供 gcc调用的参数大约有 ...

  3. 博客使用 utterances 作为评论系统

    utterances 是一款基于 GitHub issues 的评论工具. 相比同类的工具 gitment.gitalk 以及 disqus 评论工具,优点如下: 极其轻量 加载非常快 配置比较简单 ...

  4. day31-python之内置函数

    1.udp多线程 import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): prin ...

  5. 字符串导出xml文件并弹出下载对话框

    转自:https://blog.csdn.net/zhandingfeng/article/details/53887354 导出单个xml文件:[java] view plain copy      ...

  6. react-router-dom下的BrowserRouter和HashRouter

    奇思妙想的

  7. 【MySQL】你以为设置了并行复制就降低延迟了?这个你绝对想不到!

    在MySQL官方版本中,为了保证其的高可用性,一般情况我们会采用主从复制的方式来解决.当然,方法很多.而我们今天所要处理的是采用GTID方式并且开了多线程复制后,仍然延迟的情况,糟糕的是,延迟还在不断 ...

  8. elk使用不足及弥补报警措施

    全部都是6.6.2版本,就这还是没有敢选太新的 场景:每个收集点部署filebeat收集响应日志,然后发送到logstash,logstash发送到elasticsearch,和file,这里插一句, ...

  9. SpringBoot 中的使用事务

    转自:https://blog.csdn.net/linzhiqiang0316/article/details/52638039 什么是事务? 我们在开发企业应用时,对于业务人员的一个操作实际是对数 ...

  10. Android自动化测试探索(一)adb详细介绍

    adb详细介绍 #1. 基本简介 adb,即Android Debug Bridge,它是Android开发/测试人员不可替代的强大工具 #2. Mac上安装adb 安装brew /usr/bin/r ...