如何在未命名的类中运行函数(如果可能的话多个?)

时间:2014-07-14 08:36:24

标签: python python-3.x tkinter

我是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很陌生,而且可能有一个简单的答案。

顺便说一句,我已经导入了

1 个答案:

答案 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 1time.sleep,因为tkinter无法执行所有自己的函数。使用after(time, function name)