<p>我做了这样的东西:</p>
<p>它使用<code>self.root</code>,所以我可以在<code>moveBall</code>中使用它,它与<code>self.root.after(15, moveBall)</code>一起使用,15毫秒后再次运行{<cd2>},我不需要<code>while True</code>。我不需要<code>canvas.after(15)</code>和{<cd7>}。在</p>
<p>我从<code>class Application(Frame):</code>中删除了<code>Frame</code>,因为您将所有小部件直接添加到<code>root</code>中,而这个{<cd8>}从未使用过。在小部件中,您必须使用<code>self</code>而不是<code>root</code>来将小部件添加到此<code>Frame</code>,而{<cd8>}则必须使用<code>master=root</code>将它们添加到主窗口。在</p>
<pre><code>from tkinter import *
class Application():
def __init__(self):
# Constructing the Screen
self.root = Tk()
self.canvas = Canvas(self.root, width=800, height=400)
# Label
self.v = StringVar()
self.l = 5
self.label = Label(self.root, textvariable=self.v, font=('Courier',
20), bg='white', width=50)
self.v.set('Lives: ' + str(self.l))
self.label.grid()
self.canvas.grid()
# Ball
self.canvas.create_oval(
2,
2,
22,
22,
fill='red',
tags='ball',
)
# Paddle
self.canvas.create_rectangle(
360,
380,
440,
400,
fill='black',
tag='paddle',
)
# Keybindings
self.canvas.focus_set()
self.canvas.bind('<Left>', self.paddleLeft)
self.canvas.bind('a', self.paddleLeft)
self.canvas.bind('<Button-1>', self.paddleLeft)
self.canvas.bind('<Right>', self.paddleRight)
self.canvas.bind('d', self.paddleRight)
self.canvas.bind('<Button-3>', self.paddleRight)
# Logic
self.horizontal_direction = 'east'
self.vertical_direcction = 'south'
# run after 250ms so mainloop has time to start
self.root.after(250, self.moveBall)
self.root.mainloop()
def collide(self):
(x1, y1, x2, y2) = self.canvas.coords('ball')
(px1, py1, px2, py2) = self.canvas.coords('paddle')
if x2 >= 800:
self.horizontal_direction = 'west'
if x1 <= 0:
self.horizontal_direction = 'east'
if y1 <= 0:
self.vertical_direcction = 'south'
if y2 >= 400:
self.l -= 1
self.v.set('Lives: ' + str(self.l))
self.vertical_direcction = 'north'
if y2 >= py1:
if x1 in range(int(px1), int(px2)) or x2 in range(int(px1),
int(px2)):
self.vertical_direcction = 'north'
def moveBall(self):
if self.horizontal_direction == 'east':
self.canvas.move('ball', 2, 0)
else:
self.canvas.move('ball', -2, 0)
if self.vertical_direcction == 'south':
self.canvas.move('ball', 0, 2)
else:
self.canvas.move('ball', 0, -2)
self.collide()
# run again after 15ms - so I don't need `while True`
self.root.after(15, self.moveBall)
def paddleLeft(self, event):
(px1, py1, px2, py2) = self.canvas.coords('paddle')
if px1 >= 0:
self.canvas.move('paddle', -5, 0)
def paddleRight(self, event):
(px1, py1, px2, py2) = self.canvas.coords('paddle')
if px2 <= 800:
self.canvas.move('paddle', 5, 0)
# - start -
Application()
</code></pre>