与班级和tkinter的球运动

时间:2017-09-23 10:35:34

标签: python tkinter

我有以下代码可以让屏幕在屏幕的顶端和底端反弹。

顶部和底部弹跳的工作代码

/etc/bash.bashrc

当尝试从左到右(左右两侧反弹)时,我无法弄清楚逻辑或解决我的错误,如下所示。

我尝试过左右弹跳

from tkinter import *
import random
import time

class Ball: 
    def __init__(self,canvas,color): 
        self.canvas=canvas 
        self.id=canvas.create_oval(30,30,50,50,fill=color) 
        self.canvas.move(self.id,100,200)

        #ADD THESE LINES TO OUR __INIT__ METHOD
        self.x=0 
        self.y=-1 
        self.canvas_height=self.canvas.winfo_height() 

    def draw(self): 
        self.canvas.move(self.id,self.x,self.y) 
        pos=self.canvas.coords(self.id) 

        if pos[1] <=0:
            self.y=1
        if pos[3] >=self.canvas_height: 
            self.y=-1


def main():
    tk=Tk()
    tk.title("My 21st Century Pong Game")
    tk.resizable(0,0)
    tk.wm_attributes("-topmost",1)
    canvas=Canvas(tk,bg="white",width=500,height=400,bd=0,highlightthickness=0)
    canvas.pack()
    tk.update()

    ball1=Ball(canvas,'green')
    while 1:
        tk.update()
        ball1.draw() #call the ball draw method here
        time.sleep(0.01)
main()

获得答案

有人可以提供简单解释来解决问题所需的逻辑,其中坐标来自以及pos [0],pos [1]等引用的内容。我有一个想法,但它根本不清楚,并且会从一些清晰度中受益(如我所想)。

所以,我在解释+编码解决方案修复后(使用我的原始代码)来解决问题。

1 个答案:

答案 0 :(得分:0)

代码几乎是正确的。事实上,这一点几乎是正确的,一时的进一步思考可能会给你答案。您的'move x'代码已经从'move y'代码中复制粘贴,但没有进行足够的更改。小心这样做。

为了回应“pos [0]等意味着什么”,我邀请您阅读Get coords of an oval in Tkinter。 通常,矩形的坐标为(左,上,右,下)。

除了纠正错误之外,你会注意到我已经更改了以下内容:

  1. 我改变了x&amp; y变量vxvy。这些值是球的速度,而不是位置。
  2. 函数名称现在是move,而不是draw,因为函数移动而不是绘制。
  3. 带有alive行的tk.protocol变量为程序提供了一种在用户关闭窗口后清理的整洁方式。
  4. from tkinter import *
    import random
    import time
    
    class Ball: 
        def __init__(self,canvas,color):
            self.alive = True
            self.canvas = canvas 
            self.id = canvas.create_oval(30, 30, 50, 50, fill=color) 
            self.canvas.move(self.id, 100, 200)
    
            #ADD THESE LINES TO OUR __INIT__ METHOD
            self.vx = 1 
            self.vy = -1 
            self.canvas_width = self.canvas.winfo_width() 
            self.canvas_height = self.canvas.winfo_height() 
    
        def move(self): 
            self.canvas.move(self.id, self.vx, self.vy) 
            pos = self.canvas.coords(self.id) 
            if pos[0] <= 0:
                self.vx = 1
            if pos[2] >= self.canvas_width:
                self.vx = -1
            if pos[1] <= 0:
                self.vy = 1
            if pos[3] >= self.canvas_height: 
                self.vy = -1
    
        def kill(self):
            self.alive = False
    
    def main():
        tk = Tk()
        tk.title("My 21st Century Pong Game")
        tk.resizable(0, 0)
        tk.wm_attributes("-topmost", 1)
        canvas = Canvas(tk, bg="white", width=500, height=400, bd=0, highlightthickness=0)
        canvas.pack()
        tk.update()
    
        tk.protocol("WM_DELETE_WINDOW", lambda: ball1.kill())
    
        ball1 = Ball(canvas, 'green')
        while ball1.alive:
            tk.update()
            ball1.move() #call the ball move method here
            time.sleep(0.01)
        tk.destroy()
    
    if __name__ == "__main__":
        main()