python3实现小球转动抽奖小游戏


Posted in Python onApril 15, 2020

最近老师在讲 tkinter,所以我做了一个抽奖小游戏。

一、效果图

先上效果图。红色的小球会围绕蓝色小球做环形运动。我设置的四个角是奖品,其余的都是再接再厉。

python3实现小球转动抽奖小游戏

二、方法

基于tkinter中的button,text,PIL ,time.Canvas

drawPath():用于画蓝色的小球

Ball类 初始化画布、运动小球大小、运动的起点。

ball类-》draw() 控制小球的运动。这里用到一个方法叫canvas.coords。这个方法可以获取运动小球当前在画布上的坐标。并返回一个数组。比如 pos=self.canvas.coords 。左边:pos[0],右边pos[2],上边:pos[1],下边:pos[3].用if和pos 可以控制小球的上下左右运动。

self.canvas.move(self.id,self.x,self.y)
 #获取某个对象在画布的坐标,返回一个数组(两个坐标,左上角的坐标和右下角的两个坐标)
   pos = self.canvas.coords(self.id)
   getNowPoint(pos[0],pos[1],pos[2],pos[3])
   #打印获取的坐标
 
   #如果最上面的纵轴坐标在顶上,则往下移动一个像素
   if pos[1] <=30 and self.y==-80:
    self.x = 80
    self.y=0
    print("pos1" + str(self.x) + ":pos1:" + str(self.y))
   #如果最下面的纵轴坐标在底上,则向左移动
   elif pos[3] > 300 and self.x==0 and self.y==80:
    self.x = -80
    self.y=0
    print("pos3" + str(self.x) + ":pos3:" + str(self.y))
   #宽度控制#
   #如果在左边框了,那么向右边移动3像素
   elif pos[0] <30 and self.x== -80:
    self.x = 0
    self.y= -80
    print("pos0" + str(self.x) + ":pos0:" + str(self.y))
   #如果到右边框了,左移动3像素
   elif pos[2] > 300 and self.y==0:
 
    self.x = 0
    self.y=80
    print("pos2:" + str(self.x) + "pos2:" + str(self.y))

getNowPoint()当前红色运动小球的位置。

放图片的函数:

img44 = Image.open("px.jpg")
img_file44 = ImageTk.PhotoImage(img44)
canvas.create_image(200, 200, image=img_file44)(参数1,2 图片的位置x,y,参数3是图片)

三、遇到的问题

老师教的显示canvas上的内容要用mainloop(),所以一开始不知道怎么让小球动起来,最后查阅了很多资料发现。其实不用mainloop也行。可以使用tk.update() 刷新tk上的内容。所以这里我们要用一个while让小球每动一次窗体就刷新一次。time.sleep()控制小球运动速度。

四、代码

from tkinter import *
import random
import time
from PIL import Image, ImageTk
#
#创建一个类,这个类含有两个参数,一个是画布,一个是球的颜色
#
count = 0
#a = eval(input('time:'))
#b = a
global isStop
global num
isStop=0
 
def stopplay():
  global isStop
  isStop=1
def startplay():
 global isStop
 isStop = 0
class Ball:
 def __init__(self,canvas,color):
  self.canvas = canvas
  self.id = canvas.create_oval(0,0,35,35,fill=color)
  self.canvas.move(self.id,10,5)
  self.x = 80
  self.y = 0
 def draw(self):
  if isStop==0:
   self.canvas.move(self.id,self.x,self.y)
   #获取某个对象在画布的坐标,返回一个数组(两个坐标,左上角的坐标和右下角的两个坐标)
   pos = self.canvas.coords(self.id)
   getNowPoint(pos[0],pos[1],pos[2],pos[3])
   #打印获取的坐标
 
   #如果最上面的纵轴坐标在顶上,则往下移动一个像素
   if pos[1] <=30 and self.y==-80:
    self.x = 80
    self.y=0
    print("pos1" + str(self.x) + ":pos1:" + str(self.y))
   #如果最下面的纵轴坐标在底上,则向左移动
   elif pos[3] > 300 and self.x==0 and self.y==80:
    self.x = -80
    self.y=0
    print("pos3" + str(self.x) + ":pos3:" + str(self.y))
   #宽度控制#
   #如果在左边框了,那么向右边移动3像素
   elif pos[0] <30 and self.x== -80:
    self.x = 0
    self.y= -80
    print("pos0" + str(self.x) + ":pos0:" + str(self.y))
   #如果到右边框了,左移动3像素
   elif pos[2] > 300 and self.y==0:
 
    self.x = 0
    self.y=80
    print("pos2:" + str(self.x) + "pos2:" + str(self.y))
  if isStop==1:
   print("停止")
   self.canvas.move(self.id, self.x, self.y)
   # 获取某个对象在画布的坐标,返回一个数组(两个坐标,左上角的坐标和右下角的两个坐标)
   pos = self.canvas.coords(self.id)
   print(pos)
 
def getNowPoint(x1,y1,x2,y2):
 global num
 print("现在在")
 print(x1,y1,x2,y2)
 row=(x1-10)/80
 line=(y1-5)/80
 num=str(int(row))+str(int(line))
 print("点"+str(int(row))+str(int(line)))
 #return num
 
def drawPath():
 for i in range(5):
  for j in range(5):
   if i==0 or i==4:
    point = (20+80*j, 20+ 80 * i, 35+80*j, 35+ 80 * i)
    oil = canvas.create_oval(point, fill='lightblue')
   elif j==0 or j==4:
    # print("$")
    point = (20+80*j,20+ 80 * i, 35+80*j , 35+ 80 * i)
    oil = canvas.create_oval(point, fill='lightblue')
 
 
 #创建画布
 
tk = Tk()
 
tk.title("Game_ball")
tk.resizable(0,0)
tk.wm_attributes("-topmost",1)
#bd=0,highlightthickness=0 画布之外没有边框
 
canvas = Canvas(tk,width=500,height=400,bd=0,highlightthickness=0)
 
canvas.pack()
 
tk.update()
 
point=(30,30,45,45)
 
 
#创建对象
ball = Ball(canvas,'red')
drawPath()
#一直保持循环
btn_start = Button(tk,text='start',width='20',command=startplay)
btn_start.pack()
btn_end=Button(tk,text='end',width='20',command=stopplay)
btn_end.pack()
global txt
txt=""
text1=Text(tk,width=30,height=4)
while 1:
 if isStop==0:
  txt = " "
  text1.insert(INSERT, txt)
  text1.delete(0.0,INSERT)
  imgtt = Image.open("tt.jpg")
  img_filett = ImageTk.PhotoImage(imgtt)
  canvas.create_image(200, 200, image=img_filett)
  while 1:
   ball.draw()
   #快速刷新屏幕
   tk.update_idletasks()
   tk.update()
   time.sleep(0.1)
   if isStop==1:
    break
 if isStop==1:
  txt="要加油哦"
  print("num" + num)
  print(type(num))
  print(type("04"))
  if num=="00" or num=="40" or num== "04" or num== "44":
    if num=="00":
     img00=Image.open("3.jpg")
     img_file00=ImageTk.PhotoImage(img00)
     canvas.create_image(200,200,image=img_file00)
     text1.insert(INSERT,"恭喜获得键盘!!!!")
     text1.tag_configure('bold',font=('Arial', 20, 'bold', 'italic'))
    elif num=="40":
     img40 = Image.open("4.jpg")
     img_file40 = ImageTk.PhotoImage(img40)
     canvas.create_image(200, 200, image=img_file40)
     text1.insert(INSERT, "恭喜获得耳机!!!!")
     text1.tag_configure('bold', font=('Arial', 20, 'bold', 'italic'))
     text1.pack()
    elif num=="04":
     img04 = Image.open("mac.jpg")
     img_file04 = ImageTk.PhotoImage(img04)
     canvas.create_image(200, 200, image=img_file04)
     text1.insert(INSERT, "恭喜获得MAC!!!!")
     text1.tag_configure('bold', font=('Arial', 20, 'bold', 'italic'))
     text1.pack()
    elif num=="44":
     img44 = Image.open("px.jpg")
     img_file44 = ImageTk.PhotoImage(img44)
     canvas.create_image(200, 200, image=img_file44)
     text1.insert(INSERT, "恭喜获得IPHONE XS MAX!!!!")
     text1.tag_configure('bold', font=('Arial', 20, 'bold', 'italic'))
     text1.pack()
  else:
   #L1 = Label(tk, text=txt, font=('宋体', '28'))
   #L1.pack()
 
   text1.insert(INSERT,txt)
   text1.tag_configure('bold', font=('Arial', 20, 'bold', 'italic'))
   text1.pack()
  while 1:
   #ball.draw()
   # 快速刷新屏幕
   tk.update_idletasks()
   tk.update()
   time.sleep(0.1)
   #print("num"+num)
   if isStop == 0:
    break

想要学习更多关于抽奖功能的实现,请参考此专题:抽奖功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python对两个有序列表进行合并和排序的例子
Jun 13 Python
Python中Collection的使用小技巧
Aug 18 Python
初步解析Python下的多进程编程
Apr 28 Python
Python中的字符串类型基本知识学习教程
Feb 04 Python
python3.5实现socket通讯示例(TCP)
Feb 07 Python
python数据清洗系列之字符串处理详解
Feb 12 Python
Python实现对一个函数应用多个装饰器的方法示例
Feb 09 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
Oct 11 Python
Django 全局的static和templates的使用详解
Jul 19 Python
django formset实现数据表的批量操作的示例代码
Dec 06 Python
Django+Django-Celery+Celery的整合实战
Jan 20 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 Python
Django保护敏感信息的方法示例
May 09 #Python
Python基于scipy实现信号滤波功能
May 08 #Python
python实现抽奖小程序
Apr 15 #Python
Python常见数据类型转换操作示例
May 08 #Python
Python数据类型之Number数字操作实例详解
May 08 #Python
利用PyCharm Profile分析异步爬虫效率详解
May 08 #Python
Python数据类型之String字符串实例详解
May 08 #Python
You might like
php循环创建目录示例分享(php创建多级目录)
2014/03/04 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
php策略模式简单示例分析【区别于工厂模式】
2019/09/25 PHP
JQuery一种取同级值的方式(比如你在GridView中)
2012/03/15 Javascript
treepanel动态加载数据实现代码
2012/12/15 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
在javaScript中检测数据类型的几种方式小结
2017/03/04 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
vue 调用 RESTful风格接口操作
2020/08/11 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
python实现多层感知器
2019/01/18 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
Python模拟登录requests.Session应用详解
2020/11/17 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
应用艺术专业个人的自我评价
2014/01/03 职场文书
毕业生个人求职信范文分享
2014/01/05 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
学习党的群众路线实践活动思想汇报
2014/09/12 职场文书
试用期自我评价怎么写
2015/03/10 职场文书
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS