from kivy.graphics import Color,Rectangle,Canvas,ClearBuffers,ClearColor from kivy.graphics.fbo import Fbo from kivy.uix.floatlayout import FloatLayout from kivy.properties import ObjectProperty,NumericProperty from kivy.app import App from kivy.core.window import Window from kivy.animation import Animation from kivy.factory import Factory
class FboFloatLayout(FloatLayout): texture=ObjectProperty(None,allownone=True) alpha=NumericProperty(1)
def init(self,kwargs): self.canvas=Canvas() with self.canvas: self.fbo=Fbo(size=self.size) self.fbo_color=Color(1,1,1,1) self.fbo_rect=Rectangle() with self.fbo: ClearColor(0,0,0,0) ClearBuffers()
<LineEllipse2>:#赤い楕円2 canvas: Color: rgba:1,.1,.1,.9 Line: width:2. ellipse:(self.x,self.y,self.width,self.height,90,180) Label: center:root.center text:’Ellipse from 90 to 180′ #fun result with low segments!
<LineEllipse3>:#赤い楕円3 canvas: Color: rgba:1,.1,.1,.9 Line: width:2. ellipse:(self.x,self.y,self.width,self.height,90,720,10) Label: center:root.center text:’Ellipse from 90 to 720\n10 segments’ halign:’center’
<LineBezier>:#青いベジェ曲線 canvas: Color: rgba:.1,.1,1,.9 Line: width:2. bezier: (self.x,self.y,self.center_x-40,self.y+100, self.center_x+40,self.y-100,self.right,self.y) Label: center:root.center text:’Bezier’ ”’) class LineEllipse1(Widget): pass class LineEllipse2(Widget): pass class LineEllipse3(Widget): pass class LineCircle1(Widget): pass class LineCircle2(Widget): pass class LineCircle3(Widget): pass class LineCircle4(Widget): pass class LineRectangle(Widget): pass class LineBezier(Widget): pass
class LineExtendedApp(App): def build(self): root=GridLayout(cols=2,padding=50,spacing=50) root.add_widget(LineEllipse1()) root.add_widget(LineEllipse2()) root.add_widget(LineEllipse3()) root.add_widget(LineCircle1()) root.add_widget(LineCircle2()) root.add_widget(LineCircle3()) root.add_widget(LineCircle4()) root.add_widget(LineRectangle()) root.add_widget(LineBezier()) return root if name == ‘main’: LineExtendedApp().run()
from kivy.app import App from kivy.uix.floatlayout import FloatLayout from kivy.uix.slider import Slider from kivy.graphics import Color,Bezier,Line class BezierTest(FloatLayout): def init (self,points=[],loop=False,args,kwargs): super(BezierTest,self).init(args,kwargs) self.d=10 #pixel tolerance(支える) when clicking on a point self.points=points self.loop=loop self.current_point=None #index of point being dragged
def _set_bezier_dash_offset(self,instance,value): #effect to raduce(減らす) length while increase offset self.bezier.dash_length=100-value self.bezier.dash_offset=value
def _set_line_dash_offset(self,instance,value): #effect to reduce length while increase offset self.line.dash_length=100-value self.line.dash_offset=value
def on_touch_down(self,touch): if self.collide_point(touch.pos[0],touch.pos[1]): for i,p in enumerate(list(zip(self.points[::2], self.points[1::2]))):
if(abs(touch.pos[0]-self.pos[0]-p[0])<self.d and \ abs(touch.pos[1]-self.pos[1]-p[1])<self.d): self.current_point=i+1 return True return super(BezierTest,self).on_touch_down(touch)
def on_touch_up(self,touch): if self.collide_point(touch.pos[0],touch.pos[1]): if self.current_point: self.current_point=None return True
return super(BezierTest,self).on_touch_up(touch) def on_touch_move(self,touch): if self.collide_point(touch.pos[0],touch.pos[1]): c=self.current_point
if c: self.points[(c-1)2]=touch.pos[0]-self.pos[0] self.points[(c-1)2+1]=touch.pos[1]-self.pos[1] self.bezier.points=self.points self.line.points=self.points+self.points[:2] return True return super(BezierTest,self).on_touch_move(touch)
class Main(App): def build(self): from math import cos,sin,radians x=y=150 z=100 #Pacman! points=[x,y] for i in range(45,360,45): i=radians(i) points.extend([x+cos(i)z,y+sin(i)z]) return BezierTest(points=points,loop=True)
from kivy.uix.button import Button from kivy.uix.widget import Widget from kivy.uix.label import Label from kivy.uix.boxlayout import BoxLayout from kivy.app import App from kivy.graphics import Color,Rectangle from random import random as r from functools import partial class StressCanvasApp(App): def add_rects(self,label,wid,count,largs): label.text=str(int(label.text)+count) with wid.canvas:
#ここで、大きさを変えることができる for x in range(count): Color(r(),1,1,mode=’hsv’) Rectangle(pos=(r()wid.width+wid.x, r()wid.height+wid.y),size=(20,20))
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.slider import Slider from kivy.uix.widget import Widget from kivy.graphics import Rectangle,Color class DrawingWidget(Widget): def init(self): super(DrawingWidget,self).init() with self.canvas: Color(1,1,1,1)#赤、緑、青、透明度 self.rect=Rectangle(size=(self.size), pos=self.pos)
class DrawingApp(App): def build(self): root_widget=DrawingWidget() return root_widget DrawingApp().run()
実行します。
このコードを修正・追記して、ランダムな色で落書きが出来るようにします。
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.slider import Slider from kivy.uix.widget import Widget from kivy.graphics import Rectangle,Color,Line from random import random class DrawingWidget(Widget): def init(self): super(DrawingWidget,self).init() with self.canvas: Color(1,1,1,1)#赤、緑、青、透明度 self.rect=Rectangle(size=self.size, pos=self.pos)
super(DrawingWidget,self).on_touch_down(touch) with self.canvas: Color(random(),random(),random()) self.line=Line(points=[touch.pos[0],touch.pos[1]],width=2)
赤い四角のすぐ上のプログラムを、エディタ Visual Studio Codeに書いていってターミナルで実行します。
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.slider import Slider from kivy.uix.widget import Widget from kivy.graphics import Rectangle,Color class DrawingWidget(Widget): def init(self): super(DrawingWidget,self).init()
with self.canvas: Color(1,0,0,1)#赤、緑、青、透明度 Rectangle(size=(300,100), pos=(300,200)) class DrawingApp(App):
with self.canvas: Color(0,1,1,1)#赤、緑、青、透明度 Rectangle(size=(300,100), pos=(300,600))
このように書き換えました。
更に、下記のコードを追加します。
with self.canvas: Color(1,1,0,1)#赤、緑、青、透明度 Rectangle(size=(300,100), pos=(0,700)) with self.canvas: Color(1,0,1,0.7)#赤、緑、青、透明度 Rectangle(size=(300,100), pos=(0,500))
with self.canvas: Color(0,1,1,0.6)#赤、緑、青、透明度 Rectangle(size=(300,100), pos=(300,600))
with self.canvas: Color(1,1,0,1)#赤、緑、青、透明度 Rectangle(size=(300,100), pos=(600,700))
with self.canvas: Color(1,0,1,0.7)#赤、緑、青、透明度 Rectangle(size=(300,100), pos=(600,500))
with self.canvas: Color(0,1,1,0.6)#赤、緑、青、透明度 Rectangle(size=(300,100), pos=(900,600)) with self.canvas: Color(1,1,0,1)#赤、緑、青、透明度 Rectangle(size=(300,100), pos=(1200,700)) with self.canvas: Color(1,0,1,0.7)#赤、緑、青、透明度 Rectangle(size=(300,100), pos=(1200,500))
簡易的な市松模様です。シアンとマゼンタの透明度も変更しています。
では、最終的なコードにして実行します。
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.slider import Slider from kivy.uix.widget import Widget from kivy.graphics import Rectangle,Color
class DrawingWidget(Widget): def init(self): super(DrawingWidget,self).init()
with self.canvas: Color(1,1,1,1)#赤、緑、青、透明度 self.rect=Rectangle(size=(self.size), pos=self.pos)
from kivy.app import App from kivy.uix.scatter import Scatter from kivy.uix.label import Label from kivy.uix.floatlayout import FloatLayout from kivy.uix.textinput import TextInput from kivy.uix.boxlayout import BoxLayout from kivy.properties import ListProperty,ObjectProperty from kivy.graphics.vertex_instructions import (Rectangle, Ellipse, Line) from kivy.graphics.context_instructions import Color import random class ScatterTextWidget(BoxLayout): text_colour=ListProperty([1,0,0,1]) def init(self,kwargs): super(ScatterTextWidget,self).init(kwargs) def change_label_colour(self,args): colour=[random.random() for i in range(3)]+[1] self.text_colour=colour class TutorialApp(App): def build(self): return ScatterTextWidget() def some_function(args): print(‘text changed’) if name == “main”: TutorialApp().run()