pythontkinter详解

python3.6使用tkinter实现弹跳小球游戏

本文实例为大家分享了python3.6实现弹跳小球游戏的具体代码,供大家参考,具体内容如下

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • import random
  • import time
  • from tkinter import *
  •  
  •  
  • #下面定义一个球的类,有canvas和color两个对象
  • class ball:   #定义一个ball类的函数
  •   def __init__(self,canvas,paddle,color):#这是ball类的属性函数,ball类下的函数都有这些性质
  •     self.canvas=canvas
  •     self.paddle=paddle
  •     self.id=canvas.create_oval(10,10,25,25,fill=color)#返回所绘小球的调用值放入对象self.id
  •     self.canvas.move(self.id,245,100#移动小球到(245,100)坐标处,
  •     starts=[-3,-2,-1,1,2,3]  
  •     random.shuffle(starts)
  •     self.x=starts[0]    #使得小球左右方向运动随机
  •     self.y=-3       #默认开始的小球向上方运动
  •     self.canvas_height=self.canvas.winfo_height()#画布高度函数winfo_height()返回值放入canvas_height对象中
  •     self.canvas_width=self.canvas.winfo_width() #winfo_width()返回画布宽度放入canvas_width对象中
  •     self.hit_bottom=false  #设定hit_bottom初始值为false
  •  
  •  
  •   def hit_paddle(self,pos):  #声明函数,以供调用
  •     paddle_pos=self.canvas.coords(self.paddle.id#将球拍的(x1,y1)(x2,y2)的坐标放到paddle_pos中
  •     if pos[2]>=paddle_pos[0] and pos[0]<=paddle_pos[2]: #
  •       if pos[3]>=paddle_pos[1] and pos[3]<=paddle_pos[3]:  #比较小球y轴是否在球拍y轴内
  •         return true   #表示小球碰到了球拍
  •     return false #表示小球没有碰到球拍
  •  
  •  
  •   def draw(self):  #声明draw函数,
  •     self.canvas.move(self.id,self.x,self.y)  #移动小球,移动速度为(self.x,self.y),在init中的属性可以直接用
  •     pos=self.canvas.coords(self.id)#把小球的左上角和右下角的坐标以列表形式(可能元组)放入pos对象中
  •     if pos[1]<=0:   #如果小球碰到画布上方
  •       self.y=3   #则改变移动方向向下方
  •     if pos[3]>=self.canvas_height: #如果小球碰到画布底端 则返回hit_bottom为true
  •       self.hit_bottom=true
  •     if self.hit_paddle(pos)==true: #小球碰到了球拍,则改变y轴方向向上运动
  •       self.y=-3
  •     if pos[0]<=0#如果小球碰到了画布左边,则把x轴速度改成每次向右3个像素
  •       self.x=3
  •     if pos[2]>=self.canvas_width:  #如果小球碰到了画布右边,则把速度改成每次向左3个像素
  •       self.x=-3
  •  
  • class paddle:   #定义一个paddle类
  •   def __init__(self,canvas,color): #paddle类的属性函数,默认有两个变量画布和颜色
  •     self.canvas=canvas  #将canvas对象赋给self.canvas
  •     self.id=canvas.create_rectangle(0,0,100,10,fill=color)  #创建球拍,将球拍的调用编号存入self.id
  •     self.canvas.move(self.id,200,300)   #将球拍移动到(200,300)处
  •     self.x=0  #
  •     self.canvas_width=self.canvas.winfo_width()  #将画布的宽度放入canvas_width对象
  •     self.canvas.bind_all('<keypress-left>',self.turn_left)  #用bind_all()函数绑定键盘左键与tun_left函数
  •     self.canvas.bind_all('<keypress-right>',self.turn_right) #绑定键盘右键与turn_right函数
  •    
  •  
  •   def draw(self):  #声明一个draw函数
  •     self.canvas.move(self.id,self.x,0) #左右移动球拍的速度为self.x,默认不动
  •     pos=self.canvas.coords(self.id#将球拍的左上角和右下角的坐标存入pos对象中
  •     if pos[0]<=0:    #如果球拍x轴小于0,则不再向右移动
  •       self.x=0
  •     elif pos[2]>=self.canvas_width: #如果球拍要超过画布右侧了,则球拍的移动速度变为0
  •       self.x=0
  •  
  •   def turn_left(self,evt):#这里的evt是调用方传过来的参数,改变球拍的移动速度向左,
  •     self.x=-5
  •  
  •   def turn_right(self,evt): #改变球拍的移动速度向右每次5个像素
  •     self.x=5
  •  
  •  
  •   
  • #创建框架并且命名和固定,然后创建该框架的画布
  • tk=tk() #创建框架对象tk
  • tk.title('game'#框架对象tk显示的名字为'game'
  • tk.resizable(0,0#固定框架
  • tk.wm_attributes('-topmost',1) #显示在最外层
  • canvas=canvas(tk,width=500,height=400,bd=0,highlightthickness=0) #创建画布canvas,属于tk框架对象,
  • canvas.pack() #显示画布的变化
  • tk.update()  #显示框架的变化
  •  
  •  
  • #把类赋值给对象ball,如果调用了ball就可以实现该类的作用
  • paddle=paddle(canvas,"blue") #调用拍的类给对象paddle用
  • ball=ball(canvas,paddle,'green') #调用球的类给对象ball用
  •  
  • while true:  #要注意while语句以防止死循环,先设置为真
  •   if ball.hit_bottom==false: #没有碰到底部的话执行下面的语句
  •     ball.draw()  #调用ball对象的函数draw()
  •     paddle.draw()#调用paddle对象的函数draw()
  •     tk.update_idletasks()
  •     tk.update()  #更新框架
  •     time.sleep(0.01) #睡眠0.01秒
  •   elif ball.hit_bottom==true: #要是小球接触了底部
  •     canvas.create_text(200,100,text='aha,you lose it,\nhow about try again?',font=('times',22)) #在(200,100)坐标处创建文本‘...',字号22号
  •     tk.update() #更新内容
  • 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。

    原文链接:https://blog.csdn.net/K_caesura/article/details/80022807