使用python做一个年会抽奖软件(一)

先来个几张最终的图




花了2个晚上,一个下午。
最终这个功能里面,包含了滚动抽奖,显示当前场次的抽奖情况,可以显示所有抽奖,可以选择奖项,剔除了中奖的人 重新抽奖,VIP也可以重新抽奖已经中奖的人等等
当然后面因为 软件我邮件发到了自己工作邮箱,在公司一个早上又加了音乐控制,同时一些其他的bug等,不过家里的这个还是可以用的

不过,我还是先说说一开始 并不是用QT实现的,使用的tkinter, 先试了下。发现比较难用,才改用QT的。虽然都是边学边做

先说说第一个失败的例子

一开始我是在ubuntu上开发的,所以tkinter其实也开发了差不多的demo,但是放到windows上发现各种问题,就放弃了,再加上我个人感觉不好用。

tkinter做的图展示:

在tkinter里面 我用到了 菜单,按键控件,lable控件,text控件等
ubuntu里面多线程+tkinter没有啥问题,但是windows上就是各种问题。再加上不好用,,先看看代码:

关键的控件介绍:
其实很多控件的属性应该都是差不多的(个人感觉)

Label

text  要现实的文本
image 想要贴的图片
bg 背景颜色
compound 文本和图片如何显示 (center 居中)
比如:

Tkinter.Label(self.app, text=self.str_text[-1], compound='center', image=self.now_show_photo[-1])

menu

add_command: 新增一个选项
lable:标签
command: 链接的动作(函数)

self.meubar = Tkinter.Menu(self.app)
self.prize_bar = Tkinter.Menu(self.meubar, tearoff = 0)
self.prize_bar.add_command(label="一等奖", command = self.prize_menu_chose_one)
self.prize_bar.add_command(label="二等奖", command = self.prize_menu_chose_two)
self.prize_bar.add_command(label="三等奖", command = self.prize_menu_chose_three)
self.meubar.add_cascade(label='奖项设置', menu=self.prize_bar)

Button

text: 按键显示的文字
command:链接的动作
bg:背景色
其实button也支持图片, image

Tkinter.Button(self.app, text="开始", command=self.newtask, bg='gold')

Text

width: 宽
height: 高
bg: 背景颜色

 Tkinter.Text(self.app, width=5, height=1, bg = "red")

基本的一些操作

打包控件:pack()
控制位置放置: place
删除控制:destroy() place_forget()

更新UI: update

图片的处理

这里图片处理用到了PIL库:
ImageTk、Image

photo_resize(self, photo_file, para):
im = Image.open(photo_file)
print photo_file, " : ", im.size
width =  (float)(im.size[0]) * para
height=  (float)(im.size[1]) * para
im = im.resize(((int)(width), (int)(height)),Image.ANTIALIAS)
return ImageTk.PhotoImage(im), im.size

好嘞, 我的一个下午的失败作先放到这儿吧,明天在说说 QT实现的。

下面是tkinter的一个简单demo代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-import Tkinter
import time
import threading
from PIL import Image,ImageTk
import random
import copy
import ttk
import tkMessageBox as msgclass prize:hit_prize_number = 3hit_prize_persion = []  one_prize_all_number = 1one_prize_now_number = 0two_prize_all_number = 2two_prize_now_number = 0three_prize_all_number = 3three_prize_now_number = 0Vip_prize_all_number = 100Vip_prize_now_number = 0menu = ["一等奖", "二等奖", "三等奖"]class person:photo = [['t1','test_photo\unkown.png'],['t2','test_photo\unkown.png'],['t3','test_photo\unkown.png'],['t4','test_photo\\robot.png']]photo_f = []unkown_photo = ['???','test_photo\unkown.png']prize_menu = prize.menudef __init__(self):self.photo_f = copy.deepcopy(self.photo)def reset(self):self.photo_f = copy.deepcopy(self.photo)class APP_UI:backim_size = Nonestart_place = [0.8, 0.8]reset_place = [0.82, 0.95]all_show_place = [0.7, 0.2]prize_menu_place = [0.5, 0.05]#prize_show_place show_start = [0.05, 0.2]show_zone = 0.95persion_size = [182, 176]isloop = Falsenewloop = Falsemeubar = Nonehit_show = []def __init__(self):self.isloop = Falseself.newloop = Falseself.person = person()self.app = Tkinter.Tk()self.app.title('新年抽奖')#back_photo = Tkinter.PhotoImage(file='bakimage.png')self.back_photo,self.backim_size = self.photo_resize('bakimage.png', 1)self.back_lable = Tkinter.Label(self.app, image=self.back_photo, width=self.backim_size[0], height=self.backim_size[1]).pack()#size = "%dx%d" % (self.backim_size[0],self.backim_size[1])#self.app.geometry(size) #self.app.resizable(0,0)self.init_windows()self.app.config(menu=self.meubar)self.app.mainloop()def init_windows(self):self.init_button()self.init_prize_menu()self.init_text()self.init_show_photo()def init_hit_list(self, number):self.prize_hit_list = []for i in range(number):self.prize_hit_list.append(self.person.unkown_photo)def init_text(self):#self.prize_text = Tkinter.StringVar()self.prize_text = Tkinter.Text(self.app, width=5, height=1, bg = "red")p_size = self.getplace(self.prize_menu_place)self.prize_text.place(x=p_size[0], y=p_size[1])self.prize_text.insert(Tkinter.INSERT, '三等奖')self.prize_num = 3self.init_hit_list(self.prize_num)def init_show_photo(self):hit_list = self.prize_hit_listplace_all = self.clac_show_place(hit_list)self.clear_hit_show()self.hit_show = []self.now_show_photo = []self.str_text = []if len(place_all) < len(hit_list): return print "now: place_all ", place_allfor i in range(len(hit_list)):now_photo,_ = self.photo_size_set(hit_list[i][1],self.persion_size)self.now_show_photo.append(now_photo)self.str_text.append(hit_list[i][0])self.hit_show.append(Tkinter.Label(self.app, text=self.str_text[-1], compound='center', image=self.now_show_photo[-1]))p_size = self.getplace(place_all[i])self.hit_show[-1].place(x=p_size[0], y=p_size[1])def clac_show_place(self, hit_list):place_all = []number = min(len(hit_list), self.prize_num)#print numberzone_sigle = self.show_zone / numbernew_start = self.show_start[0]new_place = 0.0photo_new = (self.persion_size[0] * 1.0) / (self.backim_size[0] * 2 * 1.0)for i in range(number):new_place = [(new_start + zone_sigle / 2 - photo_new), self.show_start[1]]place_all.append(new_place)new_start += zone_siglereturn place_alldef init_prize_menu_by_box(self):self.comvalue=Tkinter.StringVar()self.comboxlist=ttk.Combobox(self.app,textvariable=self.comvalue)self.comboxlist["values"]=self.person.prize_menuself.comboxlist.current(2)self.comboxlist.bind("<<ComboboxSelected>>",self.prize_chose)p_size = self.getplace(self.prize_menu_place)self.comboxlist.place(x=p_size[0], y=p_size[1])def init_prize_menu(self):self.meubar = Tkinter.Menu(self.app)self.prize_bar = Tkinter.Menu(self.meubar, tearoff = 0)self.prize_bar.add_command(label="一等奖", command = self.prize_menu_chose_one)self.prize_bar.add_command(label="二等奖", command = self.prize_menu_chose_two)self.prize_bar.add_command(label="三等奖", command = self.prize_menu_chose_three)self.meubar.add_cascade(label='奖项设置', menu=self.prize_bar)def prize_menu_chose_one(self):print "enter config...  prize_menu_chose_one"self.prize_menu_chose(1)def prize_menu_chose_two(self):print "enter config...  prize_menu_chose_two"self.prize_menu_chose(2)def prize_menu_chose_three(self):print "enter config...  prize_menu_chose_two"self.prize_menu_chose(3)def prize_menu_chose(self,number):if number<1 : print "error"self.prize_text.delete('1.0',Tkinter.END)self.prize_text.insert(Tkinter.INSERT, self.person.prize_menu[number-1])self.clear_hit_show()self.prize_num = numberself.init_hit_list(self.prize_num)self.add_hit_prize(self.prize_hit_list)self.app.update()def prize_chose(self, *args):print(self.comboxlist.get()) def init_button(self):#start_photo = Tkinter.PhotoImage(file="start.gif")self.start_btn = Tkinter.Button(self.app, text="开始", command=self.newtask, bg='gold')p_size = self.getplace(self.start_place)self.start_btn.place(x=p_size[0], y=p_size[1], width=70, height=50)self.restart_btn = Tkinter.Button(self.app, text="重置", command=self.init_windows, font=("Arial", 5), bg='SeaGreen')p_size = self.getplace(self.reset_place)self.restart_btn.place(x=p_size[0], y=p_size[1])def test(self):print "just test---"if self.isloop == True: return#number = 0#all_number = len(self.person.photo_f)if len(self.person.photo_f)==0 :self.clear_hit_show()msg.showwarning('showwarning', '已经抽奖完了所有人')returnwhile True:if self.newloop == True:print "start chose hit..."self.newloop = Falseself.clear_hit_show()self.chose_prize_hit(self.person.photo_f)print self.prize_hit_listself.add_hit_prize(self.prize_hit_list)time.sleep(0.1)self.app.update()time.sleep(0.1)self.clear_hit_show()print "end chose hit..."return#if all_number == (number+1):#    random.shuffle(self.person.photo_f)#    number = 0#number+=1self.srcoll_show(self.person.photo_f)def test2(self):#self.srcoll_show(self.person.photo_f)#self.now_show_photo = []#self.str_text = []print 'here 1'hit_list = self.person.photo_frandom.shuffle(hit_list)place_all = self.clac_show_place(hit_list)for i in range(self.prize_num):self.str_text[i] = hit_list[i][0]temp,_ = self.photo_size_set(hit_list[i][1],self.persion_size)self.now_show_photo[i] = tempprint 'here 2'self.app.update()time.sleep(2)print 'here 3'time.sleep(2)print 'here 4'def chose_prize_hit(self, person_list):random.shuffle(person_list)for i in range(self.prize_num):if len(person_list) == 0: breaknew = person_list[0]self.prize_hit_list.append(new)person_list.remove(new)def add_hit_prize(self, hit_list):place_all = self.clac_show_place(hit_list)self.clear_hit_show()self.hit_show = []self.now_show_photo = []if len(place_all) < len(hit_list): return print "now: place_all ", place_allfor i in range(len(hit_list)):now_photo,_ = self.photo_size_set(hit_list[i][1],self.persion_size)self.now_show_photo.append(now_photo)self.hit_show.append(Tkinter.Label(self.app, text=hit_list[i][0], compound='center', image=self.now_show_photo[-1]))p_size = self.getplace(place_all[i])self.hit_show[-1].place(x=p_size[0], y=p_size[1])def clear_hit_show(self):print self.hit_showfor show in self.hit_show:#show.place_forget()show.destroy()time.sleep(0.1)self.now_show_photo = []self.prize_hit_list = []self.hit_show = []def srcoll_show(self, person_list):random.shuffle(person_list)time.sleep(0.05)show_list = []for i in range(self.prize_num):if len(person_list) <= i : breakshow_list.append(person_list[i])self.clear_hit_show()self.add_hit_prize(show_list)time.sleep(0.05)self.app.update()time.sleep(0.05)def photo_resize(self, photo_file, para):im = Image.open(photo_file)print photo_file, " : ", im.sizewidth =  (float)(im.size[0]) * paraheight=  (float)(im.size[1]) * paraim = im.resize(((int)(width), (int)(height)),Image.ANTIALIAS)return ImageTk.PhotoImage(im), im.sizedef photo_size_set(self, photo_file, size):im = Image.open(photo_file)print photo_file, " : ", im.sizeim = im.resize(((int)(size[0]), (int)(size[1])),Image.ANTIALIAS)return ImageTk.PhotoImage(im), im.sizedef getplace(self, place):p_x =  (float)(self.backim_size[0]) * place[0]p_y =  (float)(self.backim_size[1]) * place[1]return [p_x, p_y]def newtask(self):if self.isloop == False:#self.clear_hit_show()# 建立线程print "new..."t = threading.Thread(target = self.test)# 开启线程运行t.start()# 设置循环开始标志time.sleep(0.1)self.isloop = Trueelif self.isloop == True:print "stop..."self.isloop = Falseself.newloop = Truedef start_new_thread(self):t = threading.Thread(target = self.thread_show)# 开启线程运行t.start()# 设置循环开始标志time.sleep(0.1)self.isloop = True#def def main():app_ui = APP_UI()if __name__ == '__main__':main()

参考了很多同学的,不过一些忘记了:
[1]: https://blog.csdn.net/m0_37606112/article/details/78556683
[2]: https://blog.csdn.net/creatorgg/article/details/81542837
[3]: https://blog.csdn.net/u014786187/article/details/78876263
[4]: https://blog.csdn.net/qq_38366693/article/details/83144346
[5]:https://baijiahao.baidu.com/s?id=1577495887121721644&wfr=spider&for=pc

python实现抽奖软件(一)相关推荐

  1. python实现抽奖软件(一)_详解用python写一个抽奖程序

    第一次使用python写程序,确实比C/C++之类方便许多.既然这个抽奖的数据不大,对效率要求并不高,所以采用python写,更加简洁.清晰.方便. 1.用到的模块 生成随机数的模块random 用来 ...

  2. Python制作一个简单的抽奖软件(二)

    Python制作一个简单的抽奖软件(二) 认识QT 因为都对 QT和tkinter都没用过,之前简单使用tkinter后发现,界面调整不太好弄.然后度娘了之后,QT是强大GUI库之一,很多人都推荐它. ...

  3. Python+Qt抽奖点名工具源码窗体程序

     程序示例精选 Python+Qt抽奖点名工具源码窗体程序 如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助! 前言 这篇博客针对<Python+Qt抽奖点名工具源码窗体程 ...

  4. 初学者编写python用什么软件好_初学者编写python用什么软件

    初学者编写python用什么软件 以下是常用的几款Python代码编辑器和Python集成开发工具. 一.Python代码编辑器 1. Sublime Text Sublime Text是一款非常流行 ...

  5. python入门编程软件免费-Python编程干货免费领取!!!

    原标题:Python编程干货免费领取!!! 早在18 年,教育部就正式将人工智能.物联网.大数据处理正式划入高中新课标,这就意味着现在的学生16岁就要开始学习编程了! 开发岗位的高薪和人工智能的发展, ...

  6. python编写的软件界面-用Python写一个带图形界面的文件压缩软件

    这又是一篇用Python写小软件系列,最近有点写上瘾了,文件压缩和解压我们在日常工作学习中会经常用到,比如winrar.快压.好压等压缩软件,猿人学用Python做个简易图形界面的压缩软件. 打开之后 ...

  7. 使用python用什么软件-python开发工具有哪些(初学python用什么软件)

    python开发工具有哪些 一.jupyternotebookIDE简介-五星推荐 jupyternotebook是python学习与开发的一款简介的IDE,是一款Web应用程序,便于创建和编写文档等 ...

  8. python画简单的图形的代码-Python实现画图软件功能方法详解

    概述 虽然Python的强项在人工智能,数据处理方面,但是对于日常简单的应用,Python也提供了非常友好的支持(如:Tkinter),本文主要一个简单的画图小软件,简述Python在GUI(图形用户 ...

  9. python能做软件开发吗-python代码能做成软件吗

    我们首先还是使用pip进行安装: pip install PyInstaller 安装完成后,直接打开命令行,输入pyinstaller,如果显示如下界面,说明安装成功. 然后就可以进行我们小程序的封 ...

最新文章

  1. 【转载】你真的了解补码吗
  2. 一张图读懂什么是专属分布式存储
  3. 大数据架构师学习方向---加油。
  4. 因财务造假,贾跃亭被罚 2.41 亿元;华为徐直军重申不造成:但将推子品牌汽车;Gradle 7.0 发布|极客头条...
  5. 洛谷【数据结构1-1】线性表
  6. Android OpenGLES2.0使用
  7. FleaPHP的单入口文件详解
  8. tcpdf不支持html,TCPDF:无法从HTML输入生成PDF文件
  9. 服务器部署Java项目详述
  10. 【财富空间】UpHonest Capital:美国人工智能投资分析报告(精华版)
  11. 海贼王剧场版:Z 剧情详解(附TS无字幕版地址)
  12. EFI Driver Model(中)-PCI 驱动设计
  13. 反欺诈概念库-物联卡/物联网卡/流量卡
  14. 对Parcel的使用学习
  15. 软考真题答案-2021年11月系统集成项目管理工程师上午题(二)
  16. 用phpcms切换中英文网页的方法(不用解析二级域名)、phpcms完成pc和手机端切换(同一域名)...
  17. 为什么要做业务全场景的梳理?
  18. 联想z5可以刷鸿蒙系统吗,联想Z5线刷刷机教程_联想Z5线刷升级更新官方系统包方法...
  19. JS有一个棋盘,有64个方格,在第一个方格里面放1粒芝麻重量是0.00001kg,第二个里面放2粒,第三个里面放4,棋盘上放的所有芝麻的重量(两种)
  20. Python:企业微信接口封装库work-weixin-api

热门文章

  1. 解决知乎live无法下载的问题
  2. idea 2019.1.3注册码(亲测可用)
  3. Sublime Text 3 最新注册码大全
  4. C语言例题——输入两个正整数m和n,求其最大公约数和最小公倍数。
  5. 罕见!谷歌员工成立工会,国外网友:员工维权行动已席卷硅谷!
  6. 嵌入式Linux 根文件系统rootfs的构建
  7. numpy文件存取-npz,npy
  8. wltp和nedc续航差多少_WLTP续航和NEDC续航差别有多少?
  9. 算法大神左神(左程云)耗时100天打造算法与数据结构笔记
  10. 分布式调度框架Elastic-Job