回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在尝试使用Tkinter库在python中制作一个类似砖块破碎机的游戏。我有一个运行良好的早期版本的代码,但是由于缩进错误,所有函数都在<code>__init__</code>中。当我纠正了这个错误,然后添加了一些功能使它成为一个可玩的游戏时,我的主动画循环停止工作。我读了其他文章,证明这是一个间距错误,并验证了这不是使用<code>python -tt</code>。更新:<code>self.moveBall()</code>被移到<code>__init__</code>中,但是<code>moveBall()</code>仍然没有运行。</p>
<pre><code>from tkinter import *
class Application(Frame):
def __init__(self):
# Constructing the Screen
root = Tk()
Frame.__init__(self)
self.canvas = Canvas(root, width=800, height=400)
# Label
self.v = StringVar()
self.l = 5
self.label = Label(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'
self.moveBall()
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):
while True:
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.canvas.after(15)
self.collide()
self.canvas.update()
def paddleLeft(self, event):
(px1, py1, px2, py2) = self.canvas.coords('paddle')
if px1 >= 0:
self.canvas.move('paddle', -5, 0)
self.canvas.after(15)
self.canvas.update()
def paddleRight(self, event):
(px1, py1, px2, py2) = self.canvas.coords('paddle')
if px2 <= 800:
self.canvas.move('paddle', 5, 0)
self.canvas.after(15)
self.canvas.update()
def main():
app = Application()
app.mainloop()
main()
</code></pre>
<p>下面是控制台输出:</p>
^{pr2}$