我是Python 3的新手,最近开始以tkinter的形式使用tk工具包进行编程。我开始为我的Space Invaders Remix编写两个类,但我遇到了一些问题。最常见的是,我不得不为子弹的类创建多个变量,但后来我无法更新所有这些变量,因为它们都是未命名的。这是我的代码,如果它有帮助:
from tkinter import *
import easygui
import random
import time
from pygame import mixer
tk = Tk()
tk.title('Space Invaders')
tk.resizable(600,400)
tk.wm_attributes('-topmost', 1)
canvas = Canvas(tk,width = 550, height=400,bd=0,highlightthickness = 0)
canvas.pack()
canvas.update()
canvas.create_rectangle(0,0,600,400,fill ='black')
position = 0
class Spaceship:
def __init__(self, canvas, colour):
self.canvas = canvas
self.id = canvas.create_rectangle(0,0,30,20, fill=colour)
self.canvas.move(self.id, 245, 300)
self.x = 0
self.canvas_width = self.canvas.winfo_width()
self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
self.canvas.bind_all('<KeyPress-Right>', self.turn_right)
def update(self):
self.canvas.move(self.id, self.x, 0)
pos = self.canvas.coords(self.id)
if pos[0] <= 0:
self.x = 0
elif pos[2] >= self.canvas_width:
self.x = 0
def turn_left(self, evt):
self.x = -2
def turn_right(self, evt):
self.x = 2
class Bullet:
def __init__(self, canvas, colour):
self.paddle = Spaceship
self.canvas = canvas
self.id = canvas.create_rectangle(0, 0, 10,20,fill=colour)
self.canvas.move(self.id, position, 100)
self.x = 0
self.y = -1
self.canvas_height = self.canvas.winfo_height()
def update(self):
self.canvas.move(self.id, 0, -1)
spaceship = Spaceship(canvas, 'white')
def add_bullet(event):
if event.keysym == 'Up':
Bullet(canvas,'white')
while 1:
canvas.bind_all('<KeyPress-Up>', add_bullet)
spaceship.update()
Bullet.update()
tk.update_idletasks()
tk.update()
time.sleep(0.01)
同样,我对Python很陌生,而且可能有一个简单的答案。
顺便说一句,我已经导入了
答案 0 :(得分:1)
您可以在项目列表中保留项目符号
all_bullets = []
bullet = Bullet(canvas,'white')
all_bullets.append( bullet )
然后你可以使用它。
for x in all_bullets:
x.update()
如果你只需要一颗子弹而不是一如既往地使用
bullet = Bullet(canvas,'white')
bullet.update()
BTW:
您不必再次在while
中绑定密钥 - 在while
之前执行一次。
不要使用无限循环while 1
和time.sleep
,因为tkinter无法执行所有自己的函数。使用after(time, function name)
。