Python 随机函数不工作。球只向一个方向移动

Python 随机函数不工作。球只向一个方向移动,python,tkinter,Python,Tkinter,这是我的代码,但出于某种原因,每当我运行它时,球只朝一个方向移动 from tkinter import * import random import time class Ball: def __init__(self, canvas, color): self.canvas = canvas self.id = canvas.create_oval(10, 10, 25, 25, fill=color) self.canvas.mov

这是我的代码,但出于某种原因,每当我运行它时,球只朝一个方向移动

from tkinter import * import random import time

class Ball:
    def __init__(self, canvas, color):
        self.canvas = canvas
        self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
        self.canvas.move(self.id, 245, 100)
        starts = [-3, -2, -1, 1, 2, 3]
        random.shuffle(starts)
        self.x = starts[0]
        self.y = -3
        self.canvas_height = self.canvas.winfo_height()
        self.canvas_width = self.canvas.winfo_width()  
        
    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
        if pos[0] <= 0:
            self.x = 3
        if pos[2] >= self.canvas_width:
            self.x = -3     
        
tk = Tk()
tk.title("Game")
tk.resizable(0, 0)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()

ball = Ball(canvas, 'red') while 1:
    ball.draw()
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)

从tkinter导入*导入随机导入时间
班级舞会:
定义初始化(自我、画布、颜色):
self.canvas=画布
self.id=canvas.create_oval(10,10,25,25,fill=color)
self.canvas.move(self.id,245100)
开始=[-3,-2,-1,1,2,3]
随机。洗牌(开始)
self.x=开始[0]
self.y=-3
self.canvas_height=self.canvas.winfo_height()
self.canvas_width=self.canvas.winfo_width()
def牵引(自):
self.canvas.move(self.id、self.x、self.y)
pos=self.canvas.coords(self.id)
如果位置[1]=自身高度:
self.y=-1
如果位置[0]=self.canvas\u宽度:
self.x=-3
tk=tk()
标题(“游戏”)
tk.可调整大小(0,0)
tk.wm_属性(“-toppost”,1)
画布=画布(tk,宽度=500,高度=400,bd=0,highlightthickness=0)
canvas.pack()
ball=ball(画布“红色”),而1:
抽签
tk.update_idletasks()
tk.update()
睡眠时间(0.01)

有人能帮我吗?

Shuffle运行正常,但您的逻辑存在一些问题,因为哪个球总是向左侧和向上移动。你需要修改一下。另外,你必须在抽签方法中对x和y使用if和elif来阻止你的球出帧,而不是对所有的球都使用if


如有任何疑问,请随时提问。

如果遇到类似问题,请尝试调试或至少打印一些关键值,以再次检查这些值是否正确(与您假设的相同)。
因此,如果您要打印
self.canvas\u height
self.canvas\u width
值,您会注意到这些值不正确(它们总是返回
1
)。 问题的解决方案是在
init
函数中更改以下行:

self.canvas\u height=self.canvas.winfo\u height()
self.canvas_width=self.canvas.winfo_width()
对这些行:

self.canvas\u height=self.canvas.winfo\u reqheight()
self.canvas_width=self.canvas.winfo_reqwidth()

仅使用
mainloop()
而不是
update\u idletask()
update()
有什么问题。您对此做了什么调试?您是否检查了
self.x
self.y
的值,以确定它们是否是您认为应该的值?