2017-03-27 7 views
0

나는 예를 들어 버튼 뒤에 그려 넣으려고하거나 그릴 수없는 라벨 위에 흰색 영역 (재주문 영역)에서만 그릴 수 있기를 원합니다. 그것은 가능한가? 나는 페인트가 늘 버튼kivy에서 캔버스 창을 설정할 수 있는데, 흰색 영역에서만 그릴 수 있고 다른 곳에서는 그릴 수 없습니다.

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() 

답변

1

당신이 할 수있는 아래에 수 그리기로 예를 들어 레이블을 덮거나하지 그래서 학교에서 내 프로젝트를 위해, 나는 흰색 영역에서만 그릴 수 있어야합니다 필요 쉬운 길과 어려운 길. 쉬운 방법은 StencilView을 위젯으로 사용하는 것이며 nice demo입니다.

Stencil을 직접 사용하고 위젯 캔버스의 특정 영역 만 타겟팅하는 것이 더 어렵습니다.

+0

내가 treid하고 시도 bt didnt succseed ... 다른 방법이 있습니까? 또는 당신이 나를 위해 모범을 보냅시다. –

+0

@YoavLinder 링크 된 데모를 확인했는지 확인하십시오. – KeyWeeUsr

+0

이 데모로 어떻게 할 수 있을지 상상할 수 없습니다 ... 제 질문에 추가 한 코드 안에 어떻게 할 수 있습니까? 감사 –