Tkinter Python OOP:使用canvas.Move()一次性移动单独的小部件
我想把我的程序弹跳球程序翻译成OOP,以便稍微训练OOP 我遇到的问题是,如果我在包含无限循环的对象的一个实例上调用函数,下一个实例将永远不会调用它的函数。导致只有一个球移动Tkinter Python OOP:使用canvas.Move()一次性移动单独的小部件,python,loops,oop,animation,tkinter,Python,Loops,Oop,Animation,Tkinter,我想把我的程序弹跳球程序翻译成OOP,以便稍微训练OOP 我遇到的问题是,如果我在包含无限循环的对象的一个实例上调用函数,下一个实例将永远不会调用它的函数。导致只有一个球移动 import tkinter as tk import time import random #Define root windows root = tk.Tk() root.geometry("800x800") root.title("TkInter Animation Test") #Define canvas
import tkinter as tk
import time
import random
#Define root windows
root = tk.Tk()
root.geometry("800x800")
root.title("TkInter Animation Test")
#Define canvas that is inside the root window
canvas_width = 700
canvas_height = 700
canvas = tk.Canvas(root, width= canvas_width, height= canvas_height, bg="Black")
canvas.pack()
class Oval():
#Oval creation inside the canvas
def __init__(self, y1, x1, y2, x2, color):
self.y1 = y1
self.x1 = x1
self.y2= y2
self.x2= x2
self.oval = canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill=color)
#Moving the Oval(ov1)
def move(self):
self.xd = random.randint(5,10)
self.yd = random.randint(5,10)
while True:
canvas.move(self.oval, self.xd, self.yd)
# print(self.yd, self.xd)
self.coords = canvas.coords(self.oval)
# print (self.coords)
if self.coords[3] + self.yd >= 700 or self.coords[1] + self.yd <= 0:
if self.yd < 0:
self.yd = random.randint(5,10)
else:
self.yd = -(random.randint(5,10))
if self.coords[2] + self.xd >= 700 or self.coords[0] + self.xd <= 0:
if self.xd < 0:
self.xd = random.randint(5,10)
else:
self.xd = -(random.randint(5,10))
root.update()
time.sleep(.01)
ov1 = Oval(10,10,40,40, "blue")
ov2 = Oval(80,80,120,120, "red")
ov3 = Oval(240,240,270,270, "Yellow")
ov4 = Oval(360,360,400,400, "Green")
ov5 = Oval(500,500,540,540, "white")
#Problem is that ov1.move() has a internal loop and ov2.move() will never be called
# ov1.move()
# ov2.move()
# ov3.move()
# ov4.move()
# ov5.move()
tk.mainloop()
将tkinter作为tk导入
导入时间
随机输入
#定义根窗口
root=tk.tk()
根几何(“800x800”)
root.title(“TkInter动画测试”)
#定义根窗口内的画布
画布宽度=700
画布高度=700
canvas=tk.canvas(根,宽度=画布宽度,高度=画布高度,bg=“黑色”)
canvas.pack()
类Oval():
#画布内的椭圆形创作
定义初始化(self,y1,x1,y2,x2,颜色):
self.y1=y1
self.x1=x1
self.y2=y2
self.x2=x2
self.oval=canvas.create_oval(self.x1,self.y1,self.x2,self.y2,fill=color)
#移动椭圆形(ov1)
def移动(自我):
self.xd=random.randint(5,10)
self.yd=random.randint(5,10)
尽管如此:
canvas.move(self.oval、self.xd、self.yd)
#打印(self.yd、self.xd)
self.coords=canvas.coords(self.oval)
#打印(self.coords)
如果self.coords[3]+self.yd>=700或self.coords[1]+self.yd=700或self.coords[0]+self.xd已自行解决
我只是从类中取出While-True:loop并在下面的循环中调用函数
import tkinter as tk
import time
import random
#Define root windows
root = tk.Tk()
root.geometry("800x800")
root.title("TkInter Animation Test")
#Define canvas that is inside the root window
canvas_width = 700
canvas_height = 700
canvas = tk.Canvas(root, width= canvas_width, height= canvas_height, bg="Black")
canvas.pack()
class Oval():
#Oval creation inside the canvas
def __init__(self, y1, x1, y2, x2, color):
self.y1 = y1
self.x1 = x1
self.y2= y2
self.x2= x2
self.oval = canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill=color)
self.xd = random.randint(5,10)
# self.xd = 10
self.yd = random.randint(5,10)
# self.yd = 10
#Moving the Oval(ov1)
def move(self):
canvas.move(self.oval, self.xd, self.yd)
# print(self.yd, self.xd)
self.coords = canvas.coords(self.oval)
# print (self.coords)
if self.coords[3] + self.yd >= 700 or self.coords[1] + self.yd <= 0:
if self.yd < 0:
self.yd = random.randint(5,10)
# self.yd = 10
else:
self.yd = -(random.randint(5,10))
# self.yd = -10
if self.coords[2] + self.xd >= 700 or self.coords[0] + self.xd <= 0:
if self.xd < 0:
self.xd = random.randint(5,10)
# self.xd = 10
else:
self.xd = -(random.randint(5,10))
# self.xd = -10
root.update()
# time.sleep(.000000001)
ov1 = Oval(10,10,40,40, "blue")
ov2 = Oval(80,80,120,120, "red")
ov3 = Oval(240,240,270,270, "Yellow")
ov4 = Oval(360,360,400,400, "Green")
ov5 = Oval(500,500,540,540, "white")
while True:
ov1.move()
ov2.move()
ov3.move()
ov4.move()
ov5.move()
time.sleep(.01)
tk.mainloop()
将tkinter作为tk导入
导入时间
随机输入
#定义根窗口
root=tk.tk()
根几何(“800x800”)
root.title(“TkInter动画测试”)
#定义根窗口内的画布
画布宽度=700
画布高度=700
canvas=tk.canvas(根,宽度=画布宽度,高度=画布高度,bg=“黑色”)
canvas.pack()
类Oval():
#画布内的椭圆形创作
定义初始化(self,y1,x1,y2,x2,颜色):
self.y1=y1
self.x1=x1
self.y2=y2
self.x2=x2
self.oval=canvas.create_oval(self.x1,self.y1,self.x2,self.y2,fill=color)
self.xd=random.randint(5,10)
#self.xd=10
self.yd=random.randint(5,10)
#self.yd=10
#移动椭圆形(ov1)
def移动(自我):
canvas.move(self.oval、self.xd、self.yd)
#打印(self.yd、self.xd)
self.coords=canvas.coords(self.oval)
#打印(self.coords)
当第一个椭圆在True
循环中移动时,如果self.coords[3]+self.yd>=700或self.coords[1]+self.yd=700或self.coords[0]+self.xd。我意识到这一点,它永远不会持续下去。但是我不知道如何解决这个问题。你可以单独创建椭圆(没有类),它们在一个循环中移动。对不起,我不想完全取消创建:),但我已经完成了。但我想尝试使用oop来实现它,以便在使用oop时获得例程