前言:

闲着无聊写个简单的抽签工具,原意是为了决定某个群的抽签顺序,既然都准备开始做了,那就写个带界面的小程序,正好回顾一下PyQt的用法

界面外观:

整个界面由两个文本框和两个按键组成,非常的简单。如果有机会受到群友反馈的话,可以稍微做的复杂一点。左边的文本框显示昵称,右边的文本框显示抽取的顺位。

在原本的计划中,只有一个“开始”按钮,点击一次抽取一个结果。不过这样就会显得没有抽签的仪式感,最好在两个框中出现滚动的条目,所以就在“开始”按键边上增加了一个“结束”按键。点击“开始”,则开始滚动名称和顺位,点击“结束”则结束随机,固定显示最后的结果。详细的用法说明会在上传的资源中,以单独的小文件描述。

逻辑设计:

这个工具一共有三个信号。一个与“开始”按键绑定,一个与“结束”按键绑定,另一个与滚动显示绑定。

开始按键信号:

负责发送“开始滚动”信号,以及确认当前剩余未被选中的人数。当现有未被选中的人数仅为1时,那就不需要随机了,因为剩余顺位为1,剩余人数也为1,只能这样绑定了,那就直接进入结束模式,发送“结束”信号,并且停止滚动,直接返回。

    def startRandomDraw(self):self.start_clicked = Trueif (len(self.name_list) == 0):self.showMessage()returnelif (len(self.name_list) == 1):self.pause()self.stop_button.click()returnself._time_signal.emit()self.resume()

结束按键信号:

负责发送“结束滚动”信号。不过当开始按键没有被按下的时候,按“结束”按键应该无效。另外也需要确认当前剩余未被选中的人数,当当前未被选中的人数为0时,直接显示结果。在人数大于等于1时,按下“结束”按键,需要在当前人物列表和顺位列表中仍有的选项中,随机选出一个,并将这个选项从当前的顺位和人物列表中移除,以避免同一个人或同一个顺位再次被选中。

    def stopRandomDraw(self):if (self.start_clicked == False):# ignore the stop clicked signalreturnif (len(self.name_list) == 0):self.showMessage()returnself.pause()item = self.name_list.pop(0)order = self.count_list.pop(0)self.name_edit.setText(item)self.order_edit.setText(str(order+1))self.name_result[order] = item

滚动显示信号:

在后台长期滚动,仅当“结束”按键被按下后,到“开始”按键被按下前,屏幕滚动暂停。滚动信号完全由“开始”和“结束”按键控制。从程序第一次被按下“开始”按键后,就在屏幕滚动。由于一直会对屏幕进行操作,所以滚动显示信号需要一个独立的线程,由线程发送信号,去修改主线程的UI。线程具体实现就不是本文谈论的重点,这边只展示控制信号部分代码。

    def showNameAndOrder(self):random.shuffle(self.name_list)random.shuffle(self.count_list)self.name_edit.setText(self.name_list[0])self.order_edit.setText(str(self.count_list[0]+1))def showNameAndOrderSingal(self):while self.__running.isSet():self.__flag.wait()        while (True):self.__flag.wait()self._time_signal.emit()time.sleep(0.1)

在结束所有抽签之后,展示之前的所有结果。因为觉得没必要重新设计一个界面,就直接使用的QtWidgets.QMessageBox.information,通过弹窗信息来展示结果。

    def showMessage(self):res = ""for i in range(len(self.name_result)):res += "{}\t{}\n".format((i+1), self.name_result[i])QtWidgets.QMessageBox.information(QtWidgets.QWidget(), "抽签结果", res,QtWidgets.QMessageBox.Ok)app = QtWidgets.QApplication.instance()app.quit()

这边居然遇到了最大的坑,也怪我太蠢。information的第一个参数一直没有设置对,其实它是想让我提供一个实例,但是我一直提供的是一个类,而不是类的实例,所以一直在报如下的错

builtins.TypeError: information(QWidget, str, str, buttons: Union[QMessageBox.StandardButtons, QMessageBox.StandardButton] = QMessageBox.Ok, defaultButton: QMessageBox.StandardButton = QMessageBox.NoButton): argument 1 has unexpected type 'RandDraw_UI'

查了查人家说的也都不是这个问题,大概这么蠢直接用类,而不是用实例的就我一个吧。。反正重点不能用self,也不能用QtWidgets.QWidget,应该要用QtWidgets.QWidget()

大概就这么多吧,工具就上传到这个链接底下了,有需要直接使用工具的,可以自行下载。

随机抽签工具——PyQt5实现相关推荐

  1. ColorCode是一个在线随机取色工具,可以随机获取十六进制、RGB、HSl等颜色。

    ColorCode是一个在线随机取色工具,可以随机获取十六进制.RGB.HSl等颜色. ColorCode 彩蛋爆料直击现场 ColorCode是一个在线随机取色工具,可以随机获取十六进制.RGB.H ...

  2. maya拼图随机打乱工具插件

    以前做的一个小案例,拼图打乱工具,效果如下图所示: 打乱前需要record一下原始位置,之后,点击random打乱后的效果如下: 点击reset可以还原原始位置: 代码分享如下: //coded by ...

  3. 随机造句工具-曾经四五千块的工资工作的产物现在想想

    1.需求设计 2.代码展示 import tkinter as tk from tkinter import filedialog import os import xlwt import panda ...

  4. 技能梳理3@NODEMCU+串口屏+随机抽签+物理按键

    串口屏抽签,类似抽奖,物理按键选中和清除,mcu是stm32 1.项目简介 2.实现逻辑 #屏幕页面放58个图标控件,每个图标控件上显示一个人名,控件下面位置再放一个控件,可在语数外物化生6个字(6个 ...

  5. javascript随机抽签程序

    将下面的代码保存为html格式即可运行. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...

  6. 随机字符串工具类RandomStringUtils详解

    前言 项目开发中有很多场景需要我们生成一些不重复的字符串,使用UUID是我们经常使用的一种情况,但是UUID的长度比较长,而且长度是不可以自定义的,在实际的使用过程中可能会存在一些不方便的地方,今天我 ...

  7. json格式化小工具--pyqt5实例

    json格式应用在数据的前后端传输数据以及存储数据中,开发中经常用到,制作一个pyqt5的json工具,具体看示例 一.界面生成部分: 1.绘画界面以及命名设置 2.组件设置名称--修改 3-总览-- ...

  8. 字符串随机生成工具类

    package com.gblfy.util;import org.springframework.stereotype.Component;import java.util.ArrayList; i ...

  9. python随机抽签列表中的同学值日_神奇的大抽签--Python中的列表_章节测验,期末考试,慕课答案查询公众号...

    神奇的大抽签--Python中的列表_章节测验,期末考试,慕课答案查询公众号 更多相关问题 下图表示几个植物类群的进化关系.下列叙述不正确的是[ ]A.最先出现的植物类群是甲B.乙和丙都是由甲进化来的 ...

  10. Python实现随机抽签

    from random import choice import time #import BME1_name_list name_lists=["白天","邱创辰&qu ...

最新文章

  1. 如何利用图像预处理提高OCR的准确性?
  2. 什么样的文献有html阅读,有关html的参考文献
  3. 计算机网络双语名词,计算机网络中英文名词对照
  4. lucene自动补全_使用自动机的Lucene新的邻近查询
  5. SpringMVC 传递相同名称的参数的最佳方法
  6. SSHnbsp;整合-nbsp;6nbsp;-nbsp;service_serviceImp…
  7. Delphi创建ActiveX控件,实现安全接口及无界面代码
  8. 【云和恩墨】Oracle初学者入门指南-什么是 Metalink 或 MOS ?
  9. vfp保存为html,建立,生成,运行VFP菜单
  10. 野火i.MX Linux开发实战指南
  11. linux 配置软件安装源
  12. PowerDesigner实用技巧小结
  13. samtools faidx输出的fai文件格式解析 | fasta转bed | fasta to bed
  14. Hibernate框架学习1
  15. python将多个表的数据合并到一个表
  16. Python将经纬度数据转换成浮点数据
  17. clearcase命令收集
  18. sublime下载及应用
  19. c调用python第三方包_cbillington_Python包维护者_第三方库作者_PyPI项目模块Package - Python中文网...
  20. user和userdebug的应用签名在哪里配置?

热门文章

  1. 利用第三方Cookie和iframe完成广告显示(各大网站就是利用了第三方Cookie和iframe来显示百度和京东的广告)
  2. 一键刷入twrp_红米Note8Pro最简单一键获取ROOT权限教程-管理自启更省电
  3. vs2013 c++小代码运行完了不退出的方法
  4. 淘宝商品上传API接口
  5. layim之创建群聊
  6. 电脑登陆网页显示服务器出错,为什么新浪微博用电脑登陆总是提示网络错误
  7. 个人博客系统中的评论功能设计
  8. 微信小程序、前端:背景图片样式拉伸不变形
  9. 【Unity项目实战】手把手教学:飞翔的小鸟(2)脚本编写
  10. www.skymaya.com:8080/index.php,skymaya