因为程序时从上往下执行的吗!
执行到 if ball.started: 因为默认是 False ,所以不会执行 if 语句块里的内容。
到了 mainloop 的时候,是不会一直执行 if ball.started: 语句的。
做法就是 把 mainloop 去掉,因为一会儿要写循环,如果是死循环,程序就会执行不到这里,
循环里面就是 去一直执行 if ball.started:
还得加上 root.update() 如果不加程序会卡掉。
还得判断窗口是否退出,不判断会出现错误,
只需要捕获异常即可。
最终代码是:# 目的是实现左键开始运动,空格暂停,又空格运动。
import tkinter as tk
class Ball:
def __init__(self, canvas, color):
self.canvas = canvas # 在类的初始化的函数里面初始化canvas
self.id = canvas.create_oval(10, 10, 25, 25, fill=color) #画一个实心的球并记录下它的id
self.canvas.move(self.id, 250, 200) #创建球的默认在主界面上的位置,把它放在屏幕中间
self.x = 0 #默认不水平移动
self.y = -1 #默认初始向上移动
self.started=False #赋初值False
self.canvas.bind('<Button-1>',self.start) #绑定鼠标左键
self.canvas.bind('<space>',self.pause) #绑定空格
def start(self,event):
self.started=True #按鼠标就开始
def pause(self,event): #按空格就暂停,按空格在开始
if self.started:
self.started=False
else:
self.started=True
def draw(self):
self.canvas.move(self.id, self.x, self.y) #每次移动的像素
pos = self.canvas.coords(self.id) #获得移动后的坐标(x1,y1,x2,y2)
if pos[1] <= 0: #若到达顶端,就向下
self.y = 1
if pos[3] >= 400: #若到达底部,就向上
self.y = -1
self.canvas.after(5, self.draw)
root =tk.Tk()
root.title("Python game testing")
root.resizable(0, 0)
root.wm_attributes("-topmost", 1)
canvas = tk.Canvas(root, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()
canvas.update()
ball = Ball(canvas, "red")
while True:
try:
if ball.started: #如果鼠标按下就开始运动
ball.draw()
root.update() # 刷新页面,是程序不会未响应
except Exception:
break
|