2017-02-16 5 views
0

Я работаю над проектом, который позволяет вам выбирать тип ниндзя, перемещаться и атаковать врагов. У меня есть выбор ниндзя, но я не уверен, как перемещать все объекты, которые создают ниндзя. Я положил несколько объектов в функцию c.move, но я получаю эту ошибку:Я пытаюсь переместить все объекты сразу, без успеха

c.move(self.hair,self.hair2,self.head,self.neck,self.chest,self.leg1,self.leg2,self.arm1,self.arm2,0,-5) 
    File "C:\Users\mrden\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 2431, in move 
    self.tk.call((self._w, 'move') + args) 
_tkinter.TclError: wrong # args: should be ".2417470327664 move tagOrId xAmount yAmount 

Вот мой пример кода:

#Ninja Game 
from tkinter import * 
root = Tk() 
c=Canvas(width=800,height=600) 
c.pack() 
d = "" 
class Ninja: 
    def __init__(self,clan,): 
     self.clan = clan 
     if self.clan == "Uchiha": 
     self.hair = c.create_polygon(52,485,52,452,99,452,99,485) 
     self.head=c.create_rectangle(55,455,95,495,fill="white") 
     self.hair2= c.create_polygon(74,452,83,477,99,452,fill="black") 
     if self.clan == "Uzamaki": 
     self.hair = c.create_polygon(52,485,52,452,99,452,99,485,fill="#FF3232") 
     self.head=c.create_rectangle(55,455,95,495,fill="white") 
     self.neck = c.create_rectangle(59,495,91,499) 
     self.chest= c.create_rectangle(55,499,95,555) 
     self.leg1 = c.create_rectangle(55,555,71,599) 
     self.leg2 = c.create_rectangle(78,555,95,599) 
     self.arm1=c.create_rectangle(42,499,55,555) 
     self.arm2=c.create_rectangle(95,499,108,555) 
    def move(self): 
    if d == "U": 
     if self.clan == "Uzamaki": 
     c.move(self.hair,self.head,self.neck,self.chest,self.leg1,self.leg2,self.arm1,self.arm2,0,-5) 
     if self.clan == "Uchiha": 
     c.move(self.hair,self.hair2,self.head,self.neck,self.chest,self.leg1,self.leg2,self.arm1,self.arm2,0,-5) 


n = Ninja("Uchiha") 

def move_p(event): 


    global d 
    if event.keysym == "Up": 
    d = "U" 
    n.move() 

c.bind_all("<KeyPress-Up>",move_p) 

ответ

0

Полотно позволяет добавлять теги к элементам, так что вы можете рассматривать целые группы предметов как единое целое. Для этого создайте тег, добавьте этот тег к каждому элементу, а затем используйте этот тег при перемещении элемента.

Например:

class Ninja: 
    def __init__(self,clan,): 
     self.clan = clan 
     self.name = "ninja %d" % id(self) 
     if self.clan == "Uchiha": 
      self.hair = c.create_polygon(52,485,52,452,99,452,99,485, tags=[self.name, "ninja"]) 
      self.head=c.create_rectangle(55,455,95,495,fill="white", tags=[self.name, "ninja"]) 
      self.hair2= c.create_polygon(74,452,83,477,99,452,fill="black", tags=[self.name, "ninja"]) 
     if self.clan == "Uzamaki": 
      self.hair = c.create_polygon(52,485,52,452,99,452,99,485,fill="#FF3232", tags=[self.name, "ninja"]) 
      self.head=c.create_rectangle(55,455,95,495,fill="white", tags=[self.name, "ninja"]) 
     self.neck = c.create_rectangle(59,495,91,499, tags=[self.name, "ninja"]) 
     self.chest= c.create_rectangle(55,499,95,555, tags=[self.name, "ninja"]) 
     self.leg1 = c.create_rectangle(55,555,71,599, tags=[self.name, "ninja"]) 
     self.leg2 = c.create_rectangle(78,555,95,599, tags=[self.name, "ninja"]) 
     self.arm1=c.create_rectangle(42,499,55,555, tags=[self.name, "ninja"]) 
     self.arm2=c.create_rectangle(95,499,108,555, tags=[self.name, "ninja"]) 

    def move(self): 
     if d == "U": 
      c.move(self.name, 0, -5) 

Если вы дали каждому ниндзя общий тег (например: «ниндзя»), вы можете переместить все ниндзя сразу. Теги - это список, поэтому вы можете дать как общий тег, так и один конкретный для этого ниндзя.

Например:

c.create_polygon(..., tags=[self.name, "ninja"]) 

Чтобы переместить все ниндзя сразу

c.move("ninja", 0, -5) 

Для перемещения конкретного ниндзя:

c.move(n.name, 0, -5) 
+0

Oakley @ Брайан Спасибо! –