Tkinter Canvas 设计让球上下反弹

Tkinter Canvas 设计让球上下反弹

如果想让所设计的球上下反弹,首先须了解tkinter模块如何定义对象的位置。其实以这个实例而言,可以使用coords( )方法获得对象位置,它的返回值是对象的左上角和右下角坐标。

示例1

主要是建立一个球,然后用coords( )方法列出球位置的消息。

from tkinter import * 

tk = Tk()
tk.title("apidemos.com")
canvas = Canvas(tk,width=500, height=150)  
canvas.pack()
oval_id = canvas.create_oval(10,50,60,100,fill='yellow',outline='lightgray')
ballPos = canvas.coords(oval_id)
print(ballPos)  # [10.0, 50.0, 60.0, 100.0]

输出:

deepinout@ubuntu:~/apidemos.com$ python3 demos.py 
[10.0, 50.0, 60.0, 100.0]

如以上述执行结果,可以用下面的图示讲解。

Tkinter Canvas 设计让球上下反弹

相当于可以用coords( )方法获得下列结果。

ballPos[0]:球的左边x轴坐标,可用于判别是否撞到画布左方。

ballPos[1]:球的上边y轴坐标,可用于判别是否撞到画布上方。

ballPos[2]:球的右边x轴坐标,可用于判别是否撞到画布右方。

ballPos[3]:球的左边y轴坐标,可用于判别是否撞到画布下方。

示例2

设计让球可以上下移动。其实这个程序只是更改Ball类别内容。

from tkinter import * 
from random import * 
import time 

class Ball:#class Ball():#这样写是一样的
    def __init__(self,canvas,color,winW,winH):
        self.canvas = canvas
        self.id = canvas.create_oval(0, 0, 20, 20, fill=color) # 建立球对象
        self.canvas.move(self.id,winW/2,winH/2)   # 设置球最初位置
        self.x = 0     # 水平不移动
        self.y = step  # 垂直移动单位
    def ballMove(self):
        self.canvas.move(self.id, self.x, self.y)        # step是正值表示往下移动
        ballPos = self.canvas.coords(self.id)
        if ballPos[1] <= 0:
            self.y = step
        if ballPos[3] >= winH:
            self.y = -step

winW = 640      # 定义画布宽度
winH = 480      # 定义画布高度
step = 3        # 定义速度可想成位移步长
speed = 0.03    # 设置移动速度

tk = Tk()
tk.title("Bouncing Ball - apidemos")                    # 游戏窗口标题
tk.wm_attributes('-topmost',1)               # 确保游戏窗口在屏幕最上层
canvas = Canvas(tk,width=winW, height=winH)  # 建立画布
canvas.pack()
tk.update()   

ball = Ball(canvas,'yellow',winW,winH)  # 定义球对象

while True:
    ball.ballMove()
    tk.update()
    time.sleep(speed)   # 可以控制移动速度

# tk.mainloop()

输出:

Tkinter Canvas 设计让球上下反弹

程序第11行定义球x轴不移动,第12行定义y轴移动单位是step。第15行获得球的位置信息,第16、17行侦测如果球撞到画布上方则球是往下移动step单位,第18、19行侦测如果球撞到画布下方则球是往上移动step单位(因为是负值)。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程