2014-11-26 3 views
3

У меня возникли проблемы с пониманием того, что kivy делает за кулисами при использовании киви-языка при повороте изображений и перемещении их. Ниже приведен код, который должен нарисовать два изображения под углом 45 градусов на экране, а затем для каждого щелчка мыши повернуть его больше, а затем переместить его вправо на экране. Первое изображение рисуется с помощью поворота, определенного на языке kivy, где второе - это то место, где я пытаюсь переделать его только в python (чтобы лучше понять, что делает kivy), но я терпит неудачу, поскольку версия python сначала не перемещается изображение вправо, когда я увеличиваю x, но похоже, что вся система координат была повернута для этого изображения, так как она перемещается под углом 45 градусов вверх по экрану, а во-вторых, она не вращает это изображение, когда я нажимаю. Является ли кто-нибудь, кто может сказать мне, что мне не хватает, что нужно сделать в python (без использования языка киви) для получения того же поведения, что и первое изображение?Поведение вращающегося изображения между киви и питоном

благодарит заранее!

Dan

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.image import Image 
from kivy.graphics import Rotate 
from kivy.uix.widget import Widget 
from kivy.properties import NumericProperty 
from kivy.graphics.context_instructions import PopMatrix, PushMatrix 


Builder.load_string(''' 
<TestKV>: 
    canvas.before: 
     PushMatrix 
     Rotate: 
      angle: self.angle 
      axis: (0, 0, 1) 
      origin: self.center 
    canvas.after: 
     PopMatrix 
''') 

class TestKV(Image): 
    angle = NumericProperty(0) 

    def __init__(self, x, **kwargs): 
     super(TestKV, self).__init__(**kwargs) 
     self.x = x 
     self.angle = 45 

    def on_touch_down(self, touch): 
     self.angle += 20 
     self.x += 10 


class TestPY(Image): 
    angle = NumericProperty(0) 

    def __init__(self, x, **kwargs): 
     super(TestPY, self).__init__(**kwargs) 
     self.x = x 
     with self.canvas.before: 
      PushMatrix() 
      rot = Rotate() 
      rot.angle = 45 
      rot.origin = self.center 
      rot.axis = (0, 0, 1) 
     with self.canvas.after: 
      PopMatrix() 

    def on_touch_down(self, touch): 
     self.angle += 20 
     self.x += 10 

class MainWidget(Widget): 
    #this is the main widget that contains the game. 

    def __init__(self, **kwargs): 
     super(MainWidget, self).__init__(**kwargs) 
     self.all_sprites = [] 

     self.k = TestKV(source="myTestImage.bmp", x=10) 
     self.add_widget(self.k) 

     self.p = TestPY(source="myTestImage.bmp", x=200) 
     self.add_widget(self.p) 


class TheApp(App): 

    def build(self): 
     parent = Widget() 
     app = MainWidget() 
     parent.add_widget(app) 

     return parent 

if __name__ == '__main__': 
    TheApp().run() 

ответ

3

Вы никогда не изменить угол Rotate инструкции. У вас есть свойство angle вашего виджета, но это ни к чему не привязано. Вместо этого попробуйте ввести команду Rotate:

class TestPY(Image): 
    def __init__(self, **kwargs): 
     super(TestPY, self).__init__(**kwargs) 
     # self.x = x -- not necessary, x is a property and will be handled by super() 
     with self.canvas.before: 
      PushMatrix() 
      self.rot = Rotate() 
      self.rot.angle = 45 
      self.rot.origin = self.center 
      self.rot.axis = (0, 0, 1) 
     with self.canvas.after: 
      PopMatrix() 

    def on_touch_down(self, touch): 
     self.x += 10 
     self.rot.origin = self.center # center has changed; update here or bind instead 
     self.rot.angle += 20 
Смежные вопросы