Przesuwalny prostokąt nad widokiem

0

Witam

Ponownie (który to już raz) zabrałem się za mój mały projekcik na Androida. Dodaję "okienko" z tutorialem. Okienko można sobie przemieszczać, aby nie zasłaniało ekranu głównego. Problemem jest tło i niechęć do klas i pliku kv.
Używając kv i class potrafię "przykleić" rectangle do layout, ale chciałbym uzyskać ten sam efekt z with (linijka 37)

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

from kivy.app import runTouchApp,stopTouchApp
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.graphics import Color,Rectangle
from kivy.clock import Clock

gtFLOATTB_BTNS_COL=(.6,.8,.6,.8)
gtTUTOR_WIN_BACKG = (.2,.2,.7,.8)


gTutTEXT='''Tutorial tekst difuoi dugoidj idjf oidjf iodgf oijfd oigjd oidjf
dfkl kjgoifd jgifdjg ifd jgifd jgifd jgifdyut yt rtytr yr
igrd joijvk xvkjnb g dsis gidjfewoisjf oiw jfoiwjf.'''

def f_moveWIN(*d):
	Clock.schedule_once(lambda _: setattr(wlay,'pos',(d[2].pos[0]-d[0].delta[0],
                                                      d[2].pos[1]-d[0].delta[1])))
	return None

def f_touchDownWINbar(*d):
	d[0].delta[0]=d[2].pos[0]-d[0].pos[0]
	d[0].delta[1]=d[2].pos[1]-d[0].pos[1]
	return None

px,py,hbtn,wwin,hwin=10,70,40,400,160 # data for tutorial window

mlay = FloatLayout(size_hint=(1,1)) # layer for whole window

wlay = BoxLayout(orientation='vertical',size_hint=(None,None),size=(wwin,hwin),pos=(px,py))
wlay.isOpen = None # extra parameter for open/close purpose
wlay.delta = [0,0]
with wlay.canvas.before:
	Color(*gtTUTOR_WIN_BACKG)
	Rectangle(pos=wlay.pos,size=wlay.size) # <<<<<<< tu jest problem ????

#################################
#<MyTutWinLay>: # plik kv dla klasy: class MyTutWinLay(BoxLayout):
	#canvas.before:
		#Color:
			#rgba: root.backColor
		#Rectangle:
			#pos:  self.pos
			#size: self.size
#################################

drag_BTN = Button(text='== Tutorial ==',size_hint=(1,None),
                  height=hbtn,background_color=gtFLOATTB_BTNS_COL)
drag_BTN.fbind('on_touch_down',f_touchDownWINbar,wlay)
drag_BTN.fbind('on_touch_move',f_moveWIN,wlay)

textTuto = Label(text=gTutTEXT) #,pos_hint={'center_x':0,'y':0})

wlay.add_widget(textTuto)
wlay.add_widget(drag_BTN)
mlay.add_widget(wlay)

runTouchApp(mlay)
quit()

Istnieje jakieś rozwiązanie mojego problemu?

Pozdrawiam
Radek Głębicki

0

Rysujesz swój prostokąt raz i zostaje tam na wieki wieków. Tymczasem to co chcesz zrobić to rysować go za każdym razem jak przesuniesz okienko. Ergo trzeba dodać handler obserwujący zmiany property pos aby przy każdej takiej zmianie czyścił canvas i rysował prostokąt od nowa:

def handler(layout, pos):
    layout.canvas.before.clear()
    with layout.canvas.before:
        Color(*gtTUTOR_WIN_BACKG)
        Rectangle(pos=layout.pos, size=layout.size)

wlay = BoxLayout(orientation='vertical', size_hint=(None,None), size=(wwin,hwin), pos=(px,py))
wlay.bind(pos=handler)

1 użytkowników online, w tym zalogowanych: 0, gości: 1