Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>You can bind angle of canvas to <code>NumericProperty</code>, to change it from inside your code. All you need to do is to compute those angles correctly. After playing a bit with it I created following code:</p> <pre><code>from kivy.app import App from kivy.uix.widget import Widget from kivy.lang import Builder from kivy.animation import Animation from kivy.properties import NumericProperty import math kv = ''' &lt;Dial&gt;: canvas: Rotate: angle: root.angle origin: self.center Color: rgb: 1, 0, 0 Ellipse: size: min(self.size), min(self.size) pos: 0.5*self.size[0] - 0.5*min(self.size), 0.5*self.size[1] - 0.5*min(self.size) Color: rgb: 0, 0, 0 Ellipse: size: 50, 50 pos: 0.5*root.size[0]-25, 0.9*root.size[1]-25 ''' Builder.load_string(kv) class Dial(Widget): angle = NumericProperty(0) def on_touch_down(self, touch): y = (touch.y - self.center[1]) x = (touch.x - self.center[0]) calc = math.degrees(math.atan2(y, x)) self.prev_angle = calc if calc &gt; 0 else 360+calc self.tmp = self.angle def on_touch_move(self, touch): y = (touch.y - self.center[1]) x = (touch.x - self.center[0]) calc = math.degrees(math.atan2(y, x)) new_angle = calc if calc &gt; 0 else 360+calc self.angle = self.tmp + (new_angle-self.prev_angle)%360 def on_touch_up(self, touch): Animation(angle=0).start(self) class DialApp(App): def build(self): return Dial() if __name__ == "__main__": DialApp().run() </code></pre> <p>I'm calculating difference between initial (after pressing mouse) and later angle in <code>on_touch_move</code>. Since angle is a property I can also modify it using <code>kivy.animation</code> to make dial spin back after releasing mouse button.</p> <p><strong>EDIT</strong></p> <p><code>on_touch_down</code> event for child circle:</p> <pre><code>from kivy.app import App from kivy.uix.widget import Widget from kivy.uix.floatlayout import FloatLayout from kivy.lang import Builder from kivy.animation import Animation from kivy.properties import NumericProperty import math kv = ''' &lt;Dial&gt;: circle_id: circle_id size: root.size pos: 0, 0 canvas: Rotate: angle: self.angle origin: self.center Color: rgb: 1, 0, 0 Ellipse: size: min(self.size), min(self.size) pos: 0.5*self.size[0] - 0.5*min(self.size), 0.5*self.size[1] - 0.5*min(self.size) Circle: id: circle_id size_hint: 0, 0 size: 50, 50 pos: 0.5*root.size[0]-25, 0.9*root.size[1]-25 canvas: Color: rgb: 0, 1, 0 Ellipse: size: 50, 50 pos: self.pos ''' Builder.load_string(kv) class Circle(Widget): def on_touch_down(self, touch): if self.collide_point(*touch.pos): print "small circle clicked" class Dial(Widget): angle = NumericProperty(0) def on_touch_down(self, touch): if not self.circle_id.collide_point(*touch.pos): print "big circle clicked" y = (touch.y - self.center[1]) x = (touch.x - self.center[0]) calc = math.degrees(math.atan2(y, x)) self.prev_angle = calc if calc &gt; 0 else 360+calc self.tmp = self.angle return super(Dial, self).on_touch_down(touch) # dispatch touch event futher def on_touch_move(self, touch): y = (touch.y - self.center[1]) x = (touch.x - self.center[0]) calc = math.degrees(math.atan2(y, x)) new_angle = calc if calc &gt; 0 else 360+calc self.angle = self.tmp + (new_angle-self.prev_angle)%360 def on_touch_up(self, touch): Animation(angle=0).start(self) class DialApp(App): def build(self): return Dial() if __name__ == "__main__": DialApp().run() </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload