|
发表于 2020-3-28 17:31:22
|
显示全部楼层
因为程序时从上往下执行的吗!
执行到 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
复制代码 |
|