目录

杂话(解释)

全代码


上才艺。

最近需要编写一个抽奖的小玩意,但是查了一下网上使用wxpython的方法似乎不是很多,遂自己研究了一下。

杂话(解释)

以下是需要用到的一些库

import images    #存放图片编码的py文件
import wx,time,random,copy,sys,os
import wx.lib.buttons as buttons
from wx.lib.embeddedimage import PyEmbeddedImage
import threading

首先是界面,原本想使用布局,但是一来对布局不是很熟,二来一开始时我的界面设想应该是没有布局那么规则的。

class xiuli(wx.Frame):def __init__(self):wx.Frame.__init__(self, None, -1, '第一代抽奖系统', size=(550, 350),style=wx.CAPTION | wx.MINIMIZE_BOX | wx.CLOSE_BOX | wx.SYSTEM_MENU)image = PyEmbeddedImage(images.head0).GetBitmap()icon=wx.Icon()icon.CopyFromBitmap(image)self.SetIcon(icon)self.InitUI()self.Centre()self.Show()def InitUI(self):global bitmap0panel = wx.Panel(self)bitmap0 = wx.StaticBitmap(panel, -1, PyEmbeddedImage(images.backg).GetBitmap(), (0, 0))# sizer = wx.GridBagSizer(5,5)path = r"\xxxxx\xx\name.txt"if not os.path.exists(path):wx.MessageBox('未找到目标文件')sys.exit()f = open(path, 'r', encoding='utf-8')b = f.readlines()f.close()self.names=[i.replace('\n','') for i in b]print(self.names)self.name1 = copy.copy(self.names)# self.name0='\n'.join(self.names)b = ''.join(b)input1 = wx.TextCtrl(bitmap0,-1,'候选人名单:\n'+b,size=(-1,300),pos=(5,5),style=wx.TE_READONLY|wx.TE_MULTILINE)input1.SetBackgroundColour((255,255,240))self.output0 = wx.TextCtrl(bitmap0,-1,'',size=(100,-1),pos = (175,50),style=wx.TE_READONLY)self.output0.SetBackgroundColour((211, 211, 211))# output0.Disable()self.input2 = wx.TextCtrl(bitmap0,-1,'预选人数',size=(60,-1),pos=(300,50))self.input3 = wx.TextCtrl(bitmap0,-1,'抽选结果...\n------',size=(150,300),pos=(370,5),style=wx.TE_READONLY|wx.TE_MULTILINE)self.input3.SetBackgroundColour((255,228,181))self.button1 = buttons.GenBitmapTextButton(bitmap0, -1,PyEmbeddedImage(images.pic1).GetBitmap(), " 复位抽取   ",style=wx.IMAGE_ALPHA_THRESHOLD | wx.BORDER, pos=(175, 100),size=(185,35),name = '0')self.button2 = buttons.GenBitmapTextButton(bitmap0, -1, PyEmbeddedImage(images.pic2).GetBitmap(), " 清除结果   ",style=wx.IMAGE_ALPHA_THRESHOLD | wx.BORDER, pos=(175, 150), size=(185, 35),name='1')self.button3 = buttons.GenBitmapTextButton(bitmap0, -1, PyEmbeddedImage(images.pic3).GetBitmap(), " 不复位抽取",style=wx.IMAGE_ALPHA_THRESHOLD | wx.BORDER, pos=(175, 200), size=(185, 35),name='2')self.button4 = buttons.GenBitmapTextButton(bitmap0, -1, PyEmbeddedImage(images.pic4).GetBitmap(), " 停下来      ",style=wx.IMAGE_ALPHA_THRESHOLD | wx.BORDER, pos=(175, 250), size=(185, 35),name='3')self.input2.Bind(wx.EVT_LEFT_DOWN, self.text0)self.button1.Bind(wx.EVT_BUTTON, self.start1)self.button2.Bind(wx.EVT_BUTTON, self.start1)self.button3.Bind(wx.EVT_BUTTON, self.start1)self.button4.Bind(wx.EVT_BUTTON, self.end1)self.button4.Disable()

为了体现差异,唯一一块可以并需要用户填数的文本框并没有设定背景颜色。同时因为我们设定了默认文本,所以需要在鼠标点击的时候清除掉默认文本。

    def text0(self,event):if "预选人数" in self.input2.GetValue():self.input2.ChangeValue("")self.input2.SetFocus()if self.input2.GetValue() != "":self.input2.Unbind(wx.EVT_LEFT_DOWN)

每个按键都绑定一个按下-不可按-可按的事件,增强使用感。于是我将按键都绑定到同一个事件下,在事件中再用name判断按下的是哪一个键。

    def start1(self,event):btn = event.GetEventObject()btn.Disable()btnname = btn.GetName()# print(btnname)if btnname == '1':self.reclear()btn.Enable()returnnumb = self.input2.GetValue()try:numb = int(numb)except:wx.MessageBox('请填入正确人数')btn.Enable()returnself.btn = btnif btnname=='0':self.button4.Enable()self.numb = numbself.name1 = copy.copy(self.names)self.refresh_fun()elif btnname=='2':if numb not in range(1, len(self.name1)+1):wx.MessageBox('人数过多')btn.Enable()returnself.button4.Enable()self.numb = numbself.refresh_fun()else:passbtn.Enable()

然后就是具体的事件处理,我初始的设想是一号位一直切换名字,同时二号位一个个的输出名字,给用户更强的体验感,但在具体的操作后我发现这个方法似乎十分麻烦。在我直接修改界面内容时,我期望的效果是一个个名字输出,但事实上内容会一次全部输出,哪怕我中间加了sleep等待依然如此,只不过是反应的时间变得更长了。

于是我上网搜索了一下似乎在同一线程中,wxpython无法同时响应事件与更改界面,他会在处理完全部逻辑后再更改界面。

这时就需要另外引入一个线程来对界面进行更改了。

    def refresh_fun(self):self.op = Trueself.testThread = MyThread(self.output0,self.name1)self.testThread.setDaemon(True)  # 设为保护线程,主进程结束会关闭线程self.testThread.getParm()  # 获得线程内部值self.testThread.setParm(1)  # 修改线程内部值self.testThread.start()  # 开始线程class MyThread(threading.Thread):def __init__(self, aaa,names):threading.Thread.__init__(self)self.Flag = True  # 停止标志位self.Parm = 0  # 用来被外部访问的# 自行添加参数self.aaa = aaaself.names=namesdef run(self):while (True):if (not self.Flag):self.aaa.SetLabel('抽选完毕')breakelse:self.aaa.SetLabel(random.choice(self.names))# print("1")time.sleep(0.1)def setFlag(self, parm):  # 外部停止线程的操作函数self.Flag = parm  # booleandef setParm(self, parm):  # 外部修改内部信息函数self.Parm = parmdef getParm(self):  # 外部获得内部信息函数return self.Parm

可以看到,当我们按下按钮时,一号位就会开始不停地切换名字,当然我们可以在此时同时对二号位进行修改。

我这里因为找了四个图案,想要凑齐四个按键,所以没有对二号位进行修改,而且如果二号位与一号位写在同一线程中,用户的体验感会很差,因为没法保证一号位一直切换,而二号位是隔一段时间输出一个名字。(我懒得再写一个线程修改二号位,反正我第四个按钮都要修改二号位的)

按照此时的代码,我们按下按钮后一号位会一直切换名字,而停不下来,于是我们设置一个终止按钮,在按下时更改标记值,使线程终止。

同时需要注意,因为所有线程是用的是同一个对象,终止键只会暂停最新的一个线程,所以当我们按下两次按键或者更多次时,终止位只能发生一次作用。因此当我们按下一个键后我们需要将其他按键锁定。

    def end1(self,event):self.testThread.setFlag(False)if self.btn.GetName() =='2':self.continuego()elif self.btn.GetName()=='0':self.justgo()self.button4.Disable()def reclear(self):self.input3.SetValue('抽选结果...')def continuego(self):# print()for i in range(self.numb):b = random.choice(self.name1)self.input3.SetValue(self.input3.GetValue() + '\n' + b)self.name1.remove(b)self.input3.SetValue(self.input3.GetValue() + '\n' + '------')def justgo(self):                #重置抽取self.name1 = copy.copy(self.names)for i in range(self.numb):b = random.choice(self.name1)self.input3.SetValue(self.input3.GetValue() + '\n' + b)self.name1.remove(b)self.input3.SetValue(self.input3.GetValue() + '\n' + '------')self.name1 = copy.copy(self.names)

此处用到了python的copy,因为在测试时我发现,哪怕我将self.names赋值给self.name1,但实际上我修改self.name1时依然会影响到self.names。

在按下第四个按钮时终止一号位名字的切换同时判断按下的是哪一个键,然后进行具体的操作。

另外不得不一提的是,我原本希望令图片能够自适应我的组件大小,但是似乎并不可行。于是我先将图片尺寸设置好,再换成64位编码,比较常用的尺寸是32x32。

全代码

# !/usr/bin/env python
# -*-coding:utf-8 -*-"""
# File       : price.py
# Time       :2022/9/23 17:54
# Author     :Ray Zhong
# version    :python 3.7
# Description:
"""
import images
import wx,time,random,copy,sys,os
import wx.lib.buttons as buttons
from wx.lib.embeddedimage import PyEmbeddedImage
import threading
class xiuli(wx.Frame):def __init__(self):wx.Frame.__init__(self, None, -1, '第一代抽奖系统', size=(550, 350),style=wx.CAPTION | wx.MINIMIZE_BOX | wx.CLOSE_BOX | wx.SYSTEM_MENU)image = PyEmbeddedImage(images.head0).GetBitmap()icon=wx.Icon()icon.CopyFromBitmap(image)self.SetIcon(icon)self.InitUI()self.Centre()self.Show()def InitUI(self):global bitmap0panel = wx.Panel(self)bitmap0 = wx.StaticBitmap(panel, -1, PyEmbeddedImage(images.backg).GetBitmap(), (0, 0))# sizer = wx.GridBagSizer(5,5)path = r"\\itgzfs01\GZAccounts\Maxim's H.K\AP\Users\Ray Zhong\开发代码\others\name.txt"if not os.path.exists(path):wx.MessageBox('未找到目标文件')sys.exit()f = open(path, 'r', encoding='utf-8')b = f.readlines()f.close()self.names=[i.replace('\n','') for i in b]# print(self.names)self.name1 = copy.copy(self.names)# self.name0='\n'.join(self.names)b = ''.join(b)input1 = wx.TextCtrl(bitmap0,-1,'候选人名单:\n'+b,size=(-1,300),pos=(5,5),style=wx.TE_READONLY|wx.TE_MULTILINE)input1.SetBackgroundColour((255,255,240))self.output0 = wx.TextCtrl(bitmap0,-1,'',size=(100,-1),pos = (175,50),style=wx.TE_READONLY)self.output0.SetBackgroundColour((211, 211, 211))# output0.Disable()self.input2 = wx.TextCtrl(bitmap0,-1,'预选人数',size=(60,-1),pos=(300,50))self.input3 = wx.TextCtrl(bitmap0,-1,'抽选结果...\n------',size=(150,300),pos=(370,5),style=wx.TE_READONLY|wx.TE_MULTILINE)self.input3.SetBackgroundColour((255,228,181))self.button1 = buttons.GenBitmapTextButton(bitmap0, -1,PyEmbeddedImage(images.pic1).GetBitmap(), " 复位抽取   ",style=wx.IMAGE_ALPHA_THRESHOLD | wx.BORDER, pos=(175, 100),size=(185,35),name = '0')self.button2 = buttons.GenBitmapTextButton(bitmap0, -1, PyEmbeddedImage(images.pic2).GetBitmap(), " 清除结果   ",style=wx.IMAGE_ALPHA_THRESHOLD | wx.BORDER, pos=(175, 150), size=(185, 35),name='1')self.button3 = buttons.GenBitmapTextButton(bitmap0, -1, PyEmbeddedImage(images.pic3).GetBitmap(), " 不复位抽取",style=wx.IMAGE_ALPHA_THRESHOLD | wx.BORDER, pos=(175, 200), size=(185, 35),name='2')self.button4 = buttons.GenBitmapTextButton(bitmap0, -1, PyEmbeddedImage(images.pic4).GetBitmap(), " 停下来      ",style=wx.IMAGE_ALPHA_THRESHOLD | wx.BORDER, pos=(175, 250), size=(185, 35),name='3')self.input2.Bind(wx.EVT_LEFT_DOWN, self.text0)self.button1.Bind(wx.EVT_BUTTON, self.start1)self.button2.Bind(wx.EVT_BUTTON, self.start1)self.button3.Bind(wx.EVT_BUTTON, self.start1)self.button4.Bind(wx.EVT_BUTTON, self.end1)self.button4.Disable()def text0(self,event):if "预选人数" in self.input2.GetValue():self.input2.ChangeValue("")self.input2.SetFocus()if self.input2.GetValue() != "":self.input2.Unbind(wx.EVT_LEFT_DOWN)def start1(self,event):btn = event.GetEventObject()btn.Disable()btnname = btn.GetName()# print(btnname)if btnname == '1':self.reclear()btn.Enable()returnnumb = self.input2.GetValue()try:numb = int(numb)except:wx.MessageBox('请填入正确人数')btn.Enable()returnself.btn = btnif btnname=='0':self.button4.Enable()self.numb = numbself.name1 = copy.copy(self.names)self.refresh_fun()elif btnname=='2':if numb not in range(1, len(self.name1)+1):wx.MessageBox('人数过多')btn.Enable()returnself.button4.Enable()self.numb = numbself.refresh_fun()else:passbtn.Enable()def end1(self,event):self.testThread.setFlag(False)if self.btn.GetName() =='2':self.continuego()elif self.btn.GetName()=='0':self.justgo()self.button4.Disable()def refresh_fun(self):self.op = Trueself.testThread = MyThread(self.output0,self.name1)self.testThread.setDaemon(True)  # 设为保护线程,主进程结束会关闭线程self.testThread.getParm()  # 获得线程内部值self.testThread.setParm(1)  # 修改线程内部值self.testThread.start()  # 开始线程def reclear(self):self.input3.SetValue('抽选结果...')def continuego(self):# print()for i in range(self.numb):b = random.choice(self.name1)self.input3.SetValue(self.input3.GetValue() + '\n' + b)self.name1.remove(b)self.input3.SetValue(self.input3.GetValue() + '\n' + '------')def justgo(self):                #重置抽取self.name1 = copy.copy(self.names)for i in range(self.numb):b = random.choice(self.name1)self.input3.SetValue(self.input3.GetValue() + '\n' + b)self.name1.remove(b)self.input3.SetValue(self.input3.GetValue() + '\n' + '------')self.name1 = copy.copy(self.names)
class MyThread(threading.Thread):def __init__(self, aaa,names):threading.Thread.__init__(self)self.Flag = True  # 停止标志位self.Parm = 0  # 用来被外部访问的# 自行添加参数self.aaa = aaaself.names=namesdef run(self):while (True):if (not self.Flag):self.aaa.SetLabel('抽选完毕')breakelse:self.aaa.SetLabel(random.choice(self.names))time.sleep(0.1)def setFlag(self, parm):  # 外部停止线程的操作函数self.Flag = parm  # booleandef setParm(self, parm):  # 外部修改内部信息函数self.Parm = parmdef getParm(self):  # 外部获得内部信息函数return self.Parm
if __name__ == '__main__':app = wx.App()  # 创建应用程序对象login = xiuli()app.MainLoop()

ps:吐槽一下为什么代码段也要计入总字数,整得我都怀疑自己了,200行的代码统计超过1W个字

=。=!

wxpython制作抽奖页面相关推荐

  1. 【JavaScript】制作一个老虎机抽奖页面

    开发H5项目,有时会遇到一个需求,需要制作仿制老虎机游戏抽奖的网页,这个实现步骤,如果拿现成的改来做是容易的,但是想着全靠自己做是不容易的,接下来开始讲,想不想自己做,有把握学到吗 目录一览 1. 设 ...

  2. h5活动是什么意思_浅谈什么是H5页面,怎么制作h5页面

    来源|活动盒子-APP活动运营工具(huodonghezi.com) 我们经常在社交平台都可以看到很多h5页面活动,这些h5活动页面不仅做的炫酷,而且还有非常好的营销推广效果.那么,怎么制作h5页面呢 ...

  3. 学习基础HTML、CCS、JavaScript 知识实现抽奖页面

    文章目录 三剑客 内容层HTML 样式层CSS ⾏为层JavaScript 实现抽奖页面 源代码 三剑客 ⽹⻚最主要由3部分组成:结构(内容).表现(样式)和⾏为(动态交互).⽹⻚现在新的标准是W3C ...

  4. 用java的io做一个代码计数器,如何制作Java页面计数器_java

    大庆采油六厂采油工艺研究所 王兵 王波 常常逛WWW的人,一定对许多起始页上的计数器感兴趣.每当你光临某个站点的起始页时,它的计数器就很亲切地告诉你,从某年某月某日开始,你是第几位光临的人.你可能也想 ...

  5. android自定义抽奖,Android自定义view制作抽奖转盘

    本文实例为大家分享了Android自定义view制作抽奖转盘的具体代码,供大家参考,具体内容如下 效果图 TurntableActivity package com.bawei.myapplicati ...

  6. ztree和php结合实例,实例详解jQuery EasyUI结合zTree树形结构制作web页面

    JQuery EasyUI 结合 zTree树形结构制作web页面.easyui用起来比较简单,很好的封装了jquery的部分功能,使用起来更加方便,但是从1.2.3版本以后,商业用途是需要付费的,z ...

  7. rand()函数100000随机数_利用随机函数Rand、Randbetween制作抽奖器应用技巧解读

    在Excel系统中,随机数函数有两个,分别为Rand和Randbetween,其作用也是不相同的,Rank函数的作用为生成0-1之间的随机数,而Randbetween函数的作用为生成指定范围内的随机数 ...

  8. [html] 制作一个页面时,需要兼容PC端和手机端,你是要分别做两个页面还是只做一个页面自适应?为什么?说说你的理由

    [html] 制作一个页面时,需要兼容PC端和手机端,你是要分别做两个页面还是只做一个页面自适应?为什么?说说你的理由 两个页面 pc端布局和交互行为跟移动端不一样, 两个页面反而更好维护 个人简介 ...

  9. python利用thinker制作多页面切换的桌面应用实例教程

    本篇文章主要讲解,python利用thinker制作多页面的桌面实例教程.可以在一个主界面中相互进行切换和设置相关的表单信息,布局等方法 代码片段的实际效果 视频演示: python使用thinker ...

最新文章

  1. linux sar命令 性能监控
  2. iPad导入Mac:非常快!一气呵成,直接去photo里面选择,之后左上角倒出就好,颠覆之前windows上面的认知!
  3. git 更新远程分支列表(亲测)
  4. 数组洗牌算法-shuffle
  5. 60 分钟极速入门 PyTorch
  6. [渝粤教育] 西南科技大学 电子产品制造工艺 在线考试复习资料
  7. 学成在线--16.添加课程计划
  8. c语言程序可以从任何函数开始执行,C语言-基本选择题及参考答案
  9. 在保护继承中基类的共有成员_C++学习刷题13--继承的实现、继承的方式
  10. 原码,反码,补码的概念
  11. 【渝粤教育】国家开放大学2019年春季 1349学前教育科研方法 参考试题
  12. IE不支持 Promise 解决办法
  13. HiTool烧写Hi3536操作记录
  14. Logstash_snmp与Logstash_snmptrap日志采集配置说明
  15. Premiere Pro 2020 安装教程
  16. 使用Python websockets搭建互联网服务器
  17. windows10下超级好用的截屏自带快捷键
  18. Unity LOD-Level of Detail(多层次细节)用法教程
  19. 玩转Redis-生产环境如何导入、导出及删除大量数据
  20. CIM是什么?CIM智慧城市建设路径分析

热门文章

  1. 动手学深度学习之物体检测算法R-CNN,SSD,YOLO
  2. 2月,真的不要跳槽。
  3. 深度学习中的量化学习与量化训练
  4. python输入123输出321_python逆序输出,编程从键盘输入一个三位数,将它们逆序输出。如输入123,输出321.谢谢...
  5. Python中使用pip下载安装tensorflow
  6. python用户登录界面tkinter_python tkinter制作用户登录界面-Go语言中文社区
  7. 如何清空c盘只剩系统_电脑系统c盘满了怎么清理释放空间【图文】-系统城
  8. ubuntu 查看cudnn版本
  9. 跨国合作的项目管理中值得注意的一些事情
  10. firebase_Firebase真的像它看起来那样很棒