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

一、效果图

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

二、方法

基于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 = 80self.y=0print("pos1" + str(self.x) + ":pos1:" + str(self.y))#如果最下面的纵轴坐标在底上,则向左移动elif pos[3] > 300 and self.x==0 and self.y==80:self.x = -80self.y=0print("pos3" + str(self.x) + ":pos3:" + str(self.y))#宽度控制##如果在左边框了,那么向右边移动3像素elif pos[0] <30 and self.x== -80:self.x = 0self.y= -80print("pos0" + str(self.x) + ":pos0:" + str(self.y))#如果到右边框了,左移动3像素elif pos[2] > 300 and self.y==0:self.x = 0self.y=80print("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=0def stopplay():global isStopisStop=1
def startplay():global isStopisStop = 0
class Ball:def __init__(self,canvas,color):self.canvas = canvasself.id = canvas.create_oval(0,0,35,35,fill=color)self.canvas.move(self.id,10,5)self.x = 80self.y = 0def 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 = 80self.y=0print("pos1" + str(self.x) + ":pos1:" + str(self.y))#如果最下面的纵轴坐标在底上,则向左移动elif pos[3] > 300 and self.x==0 and self.y==80:self.x = -80self.y=0print("pos3" + str(self.x) + ":pos3:" + str(self.y))#宽度控制##如果在左边框了,那么向右边移动3像素elif pos[0] <30 and self.x== -80:self.x = 0self.y= -80print("pos0" + str(self.x) + ":pos0:" + str(self.y))#如果到右边框了,左移动3像素elif pos[2] > 300 and self.y==0:self.x = 0self.y=80print("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 numprint("现在在")print(x1,y1,x2,y2)row=(x1-10)/80line=(y1-5)/80num=str(int(row))+str(int(line))print("点"+str(int(row))+str(int(line)))#return numdef 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:breakif 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

用python3写一个小球转动的抽奖小游戏相关推荐

  1. iOS传感器:使用陀螺仪完成一个小球撞壁的小游戏

    上一次借着实现一个随屏幕旋转的小玩意,了解了iPhone内置的加速计.今天咱们继续搞点好玩的东东.按照计划这次要看看陀螺仪了. 最终咱们会完成一个小球撞壁的小游戏,一个超级贱的利用陀螺仪的APP.小球 ...

  2. 使用Qt写一个简单的五子棋单机小游戏

    使用Qt写一个简单的五子棋单机小游戏 刚学,不够专业请勿喷,有不对的地方还请指出,我渴望进步!现在贴出这个游戏我原创的所有代码.希望可以帮到有需要的人. 游戏界面: 因为后面添加了.wav的音频文件, ...

  3. 写一个简单的实时互动小游戏

    在写之前,我们先回顾上一篇文章,从需求.架构.设计.开发上讲述并演示了搭建一个实时通信客户端的过程,并附了图片与视频. 写这篇文章的之前,第一个互动的游戏DEMO已经写好了,先附上截图 很奇怪的一张图 ...

  4. 无聊的时候怎么办?教你用java写一个简单挂机打金币小游戏吧!

    无聊的时候怎么办?教你用java写一个超简单挂机打金币小游戏吧! Java写一个挂机打金币程序 1.Java的面向对象 2.基础打金的分析 3. Robot介绍以及Demo演示 4.挂机打金程序如何去 ...

  5. 用Python写一个双人对战足球小游戏,堪比国足的技术【附带源码】

    开发环境 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理介绍 这是一个 ...

  6. 写一个狼吃羊的小游戏

    其实在2016年,我就准备写这个小游戏了.但是奈何当时没文化?,也还没有转行成前端.既没有面向对象的思想,也不懂什么寻径算法,更不了解模块化,只是掌握了canvas的基本知识.所以以当时的水平,就搞了 ...

  7. 基于面向对象 来写一个简单的贪吃蛇小游戏(代码可直接用)

    分析一下用到的对象(这个案例的地图过于简单,可以不用创建为对象)     食物对象(food)     蛇对象(snake)     游戏对象(game) 1.food对象     属性 :x, y, ...

  8. java狼追着羊跑的程序_写一个狼吃羊的小游戏 - osc_3xmkn220的个人空间 - OSCHINA - 中文开源技术交流社区...

    其实在2016年,我就准备写这个小游戏了.但是奈何当时没文化

  9. 用原生JS写一个网页版的2048小游戏(兼容移动端)

    这个游戏JS部分全都是用原生JS代码写的,加有少量的CSS3动画,并简单的兼容了一下移动端. 先看一下在线的demo:https://yuan-yiming.github.io/2048-online ...

最新文章

  1. 华为服务器故障灯不开机_总有故障灯亮却不知道是怎么回事?详解这些你不认识的故障灯...
  2. 事件冒泡和捕获的执行顺序
  3. 设计模式--中介者(Mediator)模式
  4. 【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式
  5. [bzoj4881][Lydsy2017年5月月赛]线段游戏
  6. pytorch gpu版本下载
  7. eclipse修改编码方式
  8. linux mysql 开发_Linux64下mysql安装和开发
  9. Xshell4、Xftp4注册码
  10. ensp下载与安装问题
  11. 拍牌人数陡增6万人,中标率降至7.8%,我们错过了拍沪牌的黄金期
  12. 证券教父阚治东出手:UU跑腿获2亿元B轮融资
  13. DirectX11--使用DirectX Tool Kit帮助开发
  14. Unity | Unity中UI框架的实现与使用
  15. Your Composer dependencies require a PHP version “>= 7.2.
  16. C语言--汉诺塔小游戏
  17. 计算机 c盘搜索痕迹删除吗,如何删除C盘中垃圾文件
  18. 在MyEclipse中安装SVN插件subclipse以及check out项目
  19. linux 添加win10启动程序,linux和win10双系统添加启动项
  20. subject在python_python小笔记

热门文章

  1. 关于如何租一个云服务器进行使用
  2. matlab中cond为啥比bet好,关于dpabi中bet步骤
  3. 马氏快速记星座法——5分钟快速记忆星座和月份!超快!超准!超实用!
  4. 无监督学习 聚类分析②
  5. MATALAB绘制色图变换和Voronoi图
  6. EXCEL设置下拉框,根据不同选项变换颜色
  7. 主成分回归分析实战教程
  8. 中兴服务器车间,走进中兴通讯车间 探秘智能手机生产链(多图)
  9. 2019年,IT行业发展前景
  10. 火焰识别python_一种基于人工智能的火焰图像识别方法与流程