Python 两个弹跳的球在tkinter里总是连在一起

Python 两个弹跳的球在tkinter里总是连在一起,python,python-3.x,if-statement,tkinter,drawing,Python,Python 3.x,If Statement,Tkinter,Drawing,我试着创造几个弹跳球,但出于某种原因,它们在相同的坐标上相遇,即使它们有不同的速度和起始坐标。如果你运行下面的代码,你会发现一个球会被卡在角落里,然后另一个球会在动画的其余部分跟随它,就像一个球一样,即使它们的速度不同 import tkinter as tk from time import * from random import randint, choice myInterface = tk.Tk() s = tk.Canvas(myInterface, width=800, heig

我试着创造几个弹跳球,但出于某种原因,它们在相同的坐标上相遇,即使它们有不同的速度和起始坐标。如果你运行下面的代码,你会发现一个球会被卡在角落里,然后另一个球会在动画的其余部分跟随它,就像一个球一样,即使它们的速度不同

import tkinter as tk
from time import *
from random import randint, choice

myInterface = tk.Tk()
s = tk.Canvas(myInterface, width=800, height=800, background="black")
s.pack()



d = 75 

spdx = 8
spdy = 4.5 * -1

spdxb = 10 * -1
spdyb = 5 

xblock1 = 0
yblock1 = 0
xblock2 = 800
yblock2 = 800

x1 = randint(475,725)
y1 = randint(475,725)

x1b = randint(75,375)
y1b = randint(75,375)

color = ["yellow", "hot pink","deep skyblue","dark green"]
c = choice(color)
while True:
    ##c = choice(color) activate for disco mode!!
    x1 = x1 + spdx
    y1 = y1 - spdy
    x2 = x1 + d
    y2 = y1 + d

    x1b = x1b + spdx
    y1b = y1b - spdy
    x2b = x1b + d
    y2b = y1b + d


    firstball = s.create_oval(x1,y1,x2,y2, fill=c)
    secondball = s.create_oval(x1b,y1b, x2b,y2b, fill =c)

    #A1
    if x1 <= xblock1:
        x1 = xblock1
        x2 = x1 + d
        spdx = spdx * -1
    #B1  
    if x1b <= xblock1:
        x1b = xblock1
        x2b = x1b + d
        spdxb = spdxb * -1
    #A2
    if x2 >= xblock2:
        x2 = xblock2
        x1 = x2 - d
        spdx = spdx * -1
    #B2
    if x2b >= xblock2:
        x2b = xblock2
        x1b = x2b - d
        spdxb = spdxb * -1
    #A3
    if y1 <= yblock1:
        y1 = yblock1
        y2 = y1 + d
        spdy = spdy * -1
    #B3
    if y1b <= yblock1:
        y1b = yblock1
        y2b = y1b + d
        spdyb = spdyb * -1
    #A4
    if y2 >= yblock2:
        y2 = yblock2
        y1 = y2 - d
        spdy = spdy * -1

    #B4
    if y2b >= yblock2:
        y2b = yblock2
        y1b = y2b - d
        spdyb = spdyb * -1


    s.update()
    sleep(0.03)
    s.delete(firstball,secondball)
将tkinter作为tk导入
不定期进口*
从随机导入randint,选择
myInterface=tk.tk()
s=tk.Canvas(myInterface,宽度=800,高度=800,背景=“黑色”)
s、 包()
d=75
spdx=8
spdy=4.5*-1
spdxb=10*-1
spdyb=5
xblock1=0
yblock1=0
xblock2=800
yblock2=800
x1=randint(475725)
y1=randint(475725)
x1b=randint(75375)
y1b=randint(75375)
颜色=[“黄色”、“热粉色”、“深天蓝色”、“深绿色”]
c=选择(颜色)
尽管如此:
##c=选择(颜色)激活disco模式!!
x1=x1+spdx
y1=y1-spdy
x2=x1+d
y2=y1+d
x1b=x1b+spdx
y1b=y1b-spdy
x2b=x1b+d
y2b=y1b+d
第一个球=s。创建椭圆(x1,y1,x2,y2,填充=c)
secondball=s.create_oval(x1b、y1b、x2b、y2b、fill=c)
#A1
如果x1=xblock2:
x2b=xblock2
x1b=x2b-d
spdxb=spdxb*-1
#A3
如果y1=yblock2:
y2b=yblock2
y1b=y2b-d
spdyb=spdyb*-1
s、 更新()
睡眠(0.03)
s、 删除(第一个球,第二个球)

问题在于,您正在使用
spdx
spdy
来更新ball 2,而不是
spdxb
spdyb

因此,当球2击中左边缘时,它每帧只来回翻转一次。这没有任何作用,因为您没有对任何内容使用
spdxb
。同时,两个球都使用的spdx在球1击中左边边缘之前不会翻转


顺便说一句,这是一个很好的例子,说明为什么DRY(不要重复你自己)是如此重要的规则。因为您已经多次复制和粘贴了带有微小更改的同一代码,所以很容易将其中一个微小更改弄错而看不到它。特别是在你盯着看了几个小时的代码中。

问题是你用
spdx
spdy
来更新ball 2,而不是
spdxb
spdyb

因此,当球2击中左边缘时,它每帧只来回翻转一次。这没有任何作用,因为您没有对任何内容使用
spdxb
。同时,两个球都使用的spdx在球1击中左边边缘之前不会翻转


顺便说一句,这是一个很好的例子,说明为什么DRY(不要重复你自己)是如此重要的规则。因为您已经多次复制和粘贴了带有微小更改的同一代码,所以很容易将其中一个微小更改弄错而看不到它。尤其是在你已经看了几个小时的代码中。

你建议我做什么,而不是重复if语句?@Abdullah如何抽象这取决于你有多少知识。你知道如何定义和使用类吗?还是函数?@Abdullah告诉我如何将大部分工作分解出来,这样你就不必重复了(所以只有一个地方可以出错,而不是8个)。谢谢你,但我在高中,刚刚开始编写代码,我了解其中的20%。@Abdullah是的,这就是为什么我问你之前有多少知识……现在,请记住,通常有一些方法可以重构代码以消除任何重复,当你学习更多Python时,请密切关注它们,你的学习将获得更多的成果。你建议我做什么来代替重复if语句?@Abdullah如何抽象这一点取决于你有多少知识。你知道如何定义和使用类吗?还是函数?@Abdullah告诉我如何将大部分工作分解出来,这样你就不必重复了(所以只有一个地方可以出错,而不是8个)。谢谢你,但我在高中,刚刚开始编写代码,我了解其中的20%。@Abdullah是的,这就是为什么我问你之前有多少知识……现在,请记住,通常有一些方法可以重构代码以消除任何重复,并在学习更多Python时密切关注这些方法,您将从学习中获得更多收获。