2017-03-27 4 views
0

Je veux pouvoir dessiner seulement dans la zone blanche (la zone de recollement) par exemple si vous essayez de dessiner derrière les boutons ou sur l'étiquette qu'il ne dessine pas. c'est possible? je en ai besoin pour mon projet à l'école, je dois être en mesure de tirer seulement dans la zone blanche que la peinture couvre wont l'étiquette par exemple ou ne pas être dessin en mesure sous les boutonsPuis-je définir la fenêtre de toile dans kivy que je ne peux dessiner que sur la zone blanche et ne pas être en mesure de dessiner sur les autres endroits?

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.widget import Widget 
from kivy.uix.button import Button 
from kivy.graphics import Color, Rectangle, Line 
from kivy.uix.stencilview import StencilView 
from kivy.core.window import Window 
import socket 
import sys 
import os 
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import ObjectProperty 
from kivy.uix.label import Label 
from functools import partial 



class MyPaintWidget(Widget): 
    lineSize = 5 
    def on_touch_down(self, touch): 
     with self.canvas: 
      touch.ud['Line'] = Line(points=(touch.x, touch.y), width=self.lineSize) 

    def on_touch_move(self, touch): 
     touch.ud['Line'].points += [touch.x, touch.y] 
class MyPaintApp(App): 
    def build(self): 
     self.parent = Widget() 
     self.painter=MyPaintWidget(size=(695,510),pos=(100,50)) 
     with self.painter.canvas: 
      Rectangle(pos=(100,50), size=(695,510)) 
     with open("Send_word.txt",'r') as fr: 
      word_lable = Label(text = "Your word is " + fr.read(),font_size='30sp',pos = (400,530)) 
     self.parent.add_widget(word_lable) 

     finishbtn = Button(text='finish',pos=(0, 0),size = (100,150))#finish button position and text 
     finishbtn.bind(on_release=self.finish)#finish button onclick 

     erasebtn = Button(text = "Erasor",pos=(0,150),size =(100,150))#erasor button position and text 
     erasebtn.bind(on_release=self.black) 

     redbtn = Button(text = "Red",background_color=(255,0,0,1.0),pos=(100, 0), size=(100,50)) 
     redbtn.bind(on_release=self.red) 

     bluebtn = Button(text = "Blue",background_color=(0,0,255,1.0),pos=(200, 0), size=(100,50)) 
     bluebtn.bind(on_release=self.blue) 

     greenbtn = Button(text = "Green",background_color=(0,255,0,1.0),pos=(300, 0), size=(100,50)) 
     greenbtn.bind(on_release=self.green) 

     whitebtn = Button(text = "Black",pos=(400, 0), size=(100,50)) 
     whitebtn.bind(on_release=self.white) 

     yellowbtn = Button(text = "Yellow",background_color=(255,255,0,1.0),pos=(500, 0), size=(100,50)) 
     yellowbtn.bind(on_release=self.yellow) 

     lightbluebtn = Button(text = "L.Blue",background_color=(0,255,255,1.0),pos=(600, 0), size=(100,50)) 
     lightbluebtn.bind(on_release=self.lightblue) 

     purplebtn = Button(text = "Purple", size=(100,50),background_color=(148,0,211,1.0),pos=(700,0)) 
     purplebtn.bind(on_release=self.purple) 

     sizeupbtn = Button(text = "SizeUp",pos=(0, 300),size = (100,150)) 
     sizeupbtn.bind(on_release=self.SizeUp) 


     sizedowmbtn = Button(text = "SizeDown",pos=(0, 450),size = (100,150)) 
     sizedowmbtn.bind(on_release=self.SizeDown) 



     self.parent.add_widget(self.painter) 
     #self.parent.add_widget(word_lable()) 
     self.parent.add_widget(finishbtn) 
     self.parent.add_widget(redbtn) 
     self.parent.add_widget(bluebtn) 
     self.parent.add_widget(greenbtn) 
     self.parent.add_widget(whitebtn) 
     self.parent.add_widget(yellowbtn) 
     self.parent.add_widget(erasebtn) 
     self.parent.add_widget(lightbluebtn) 
     self.parent.add_widget(purplebtn) 
     self.parent.add_widget(sizeupbtn) 
     self.parent.add_widget(sizedowmbtn) 
     return self.parent 
    def finish(self,obj): 
     self.painter.export_to_png("screenshot.png") 
     sexi = open("Send_word.txt",'r').read() 
     print repr(sexi) 
     send_file(sexi) 

    def red(self,obj): 
     with self.painter.canvas: 
      Color(1,0,0) 

    def blue(self,obj): 
     with self.painter.canvas: 
      Color(0,0,1) 

    def green(self,obj): 
     with self.painter.canvas: 
      Color(0,1,0) 

    def white(self,obj): 
     with self.painter.canvas: 
      Color(0,0,0) 


    def yellow(self,obj): 
     with self.painter.canvas: 
      Color(1,1,0) 

    def black(self,obj): 
     with self.painter.canvas: 
      Color(1,1,1) 

    def lightblue(self,obj): 
     with self.painter.canvas: 
      Color(0,1,1) 

    def purple(self,obj): 
     with self.painter.canvas: 
      Color(1,0,1) 

    def SizeUp(self,obj): 
     if(self.painter.lineSize <100): 
      self.painter.lineSize += 5 

    def SizeDown(self,obj): 
     if(self.painter.lineSize >1): 
      self.painter.lineSize -= 5 

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

Répondre

1

Vous pouvez le faire le moyen facile et à la dure. Le moyen le plus simple est d'utiliser StencilView comme un widget, qui a un nice demo. Le moyen le plus difficile est d'utiliser le Stencil directement et de ne cibler que des zones spécifiques du canevas du widget.

+0

j'ai treid et essayé bt didnt succincted ... il y a un autre moyen? ou pouvez-vous m'envoyer un exemple pour cela? –

+0

@YoavLinder Assurez-vous d'avoir coché la démo liée. – KeyWeeUsr

+0

je ne pouvais pas comprendre comment le faire avec cette démo ... pouvez-vous me montrer comment le faire dans le code que j'ai ajouté à la question s'il vous plaît? Merci –