FloatLayout wewnatrz FloatLayout

0

znowu sie troche bawie kivyi na razie z FloatLayout , no i mam pytanie :

A = FloatLayout(size_hint=(None, None), size=(800, 800), pos=(200, 200))

# Tworzenie warstwy B (FloatLayout)
B = FloatLayout(size_hint=(None, None), size=(400, 400), pos=(0, 0))

# Dodawanie tła dla warstwy A (czerwone)
with A.canvas.before:
  Color(1, 0, 0, 1)
  Rectangle(pos=A.pos, size=A.size)

# Dodawanie tła dla warstwy B (zielone)
with B.canvas.before:
  Color(0, 1, 0, 1)
  Rectangle(pos=B.pos, size=B.size)

# Tworzenie przykładowego napisu (Label) wewnątrz B
gg = Label(text="Przykładowy napis", size_hint=(None, None), size=(100, 100), pos=(100, 100))
B.add_widget(gg)

# Dodawanie warstwy B jako dziecka do warstwy A
A.add_widget(B)

# Dodawanie warstwy A do głównego widżetu (np. App)
self.add_widget(A)

no i w zalozeniu gg jest w B , B jest w A ( kolory sa po to zeby sie zoorientowal jak to sie na ekranie uklada)

ale jak to uruchomie to wszystko jest ustawione w stosunku do ekranu glownego

No i dlaczego ?

0

zrobilem inna probe bez FloatLayout , same BoxLayout :

# rysuje ramke
class R(Widget):
    def __init__(self,x,y,szer,wys, kB=(1, 1, 1, 1)):
        self.x=x
        self.y=y
        self.szer=szer
        self.wys=wys
        super().__init__()
        with self.canvas:
            Color(*kB)
            #width=2.0
            #Line(points=(self.x,self.y,self.szer,self.wys))
            Line(rectangle=(self.x,self.y,self.szer,self.wys),width=1.5)
            #print(str(self.height))


Okno = BoxLayout(orientation='vertical', spacing=10)

Top = BoxLayout(orientation='horizontal', spacing=10,size_hint=(1, .35))
F.CustomGraphics.SetBG(Top, bg_color=[0,1,0,0.2])
Top.add_widget(Label(text="aaaaa"))

Srodek = BoxLayout(orientation='horizontal', spacing=10)
            
S1 = BoxLayout(orientation='vertical', spacing=10)
F.CustomGraphics.SetBG(S1, bg_color=[1,0,0,0.2])
S1.add_widget(Label(text="bb 11"))
Srodek.add_widget(S1)

S2 = BoxLayout(orientation='vertical', spacing=10)
F.CustomGraphics.SetBG(S2, bg_color=[1,1,0,0.2])
S2.add_widget(R(100,100,100,100, kB=Ziel50))
Srodek.add_widget(S2)

Bottom = BoxLayout(orientation='horizontal', spacing=10,size_hint=(1, .35))
Bottom.add_widget(Label(text="cccc"))
            
Okno.add_widget(Top)
Okno.add_widget(Srodek)
Okno.add_widget(Bottom)

self.add_widget(Okno)

w S2 narysowalem ramke, no miala byc w S2(czyli poprawej stronie , na srodku) ale pojawia sie w dolnym rogu, w 100,100 ekranu

czyli troche podobnie jak wyzej. odnosnikiem jest ekran glowny

Czy cos zle przypoisuje?

0

MAIN = FloatLayout(size_hint=(1, 1), )

A = FloatLayout(size_hint=(None, None), size=(300, 300), pos=(250, 50))

# Tworzenie warstwy B (FloatLayout)
B = FloatLayout(size_hint=(None, None), size=(400, 400), pos=(110, 110))

# Dodawanie tła dla warstwy A (czerwone)
with A.canvas.before:
  Color(1, 0, 0, 1)
  Rectangle(pos=A.pos, size=A.size)

# Dodawanie tła dla warstwy B (zielone)
with B.canvas.before:
  Color(0, 1, 0, 1)
  Rectangle(pos=B.pos, size=B.size)

# Tworzenie przykładowego napisu (Label) wewnątrz B
gg = Label(text="Przykładowy napis", size_hint=(None, None), size=(100, 100), pos=(100, 100))
#B.add_widget(gg)

# Dodawanie warstwy B jako dziecka do warstwy A
#A.add_widget(B)

# Dodawanie warstwy A do głównego widżetu (np. App)
MAIN.add_widget(A)
MAIN.add_widget(B)

runTouchApp(MAIN)

Efekt:
screenshot-20240428003655.png

0

nawet o tym myslalem, co mam pod spodem :)

Bo sie troche zgubilem pop tych wszystkich zmianach.

bo juz nic nie mam w pliku kv, wszystko w pythonie.

i nawet mi to dziala , tak jak w FloatLayout.

Dopiero dzis zauwazylem jak chcialem zagniezdzic ze nie moge.

Musze sobie to przejrzec i przemyslec.

sm = ScreenManager(transition=NoTransition())

screens = [LoginWindow(name="login"), CreateAccountWindow(name="create"),UserWindow(name="main")]
for screen in screens:
    sm.add_widget(screen)

sm.current = "login"

zmieniam sm.current i jestem w screenie ktory chce.

Ale jak usunolem wszystko z pliku kv, to w sumie nie wiem gdzie ustawiam rodzaj layoutu 😀

Czy jest jakis domyslny ?

0
# Tworzenie warstwy podstawowej (FloatLayout)
MAIN = FloatLayout(size_hint=(1, 1), )

# Tworzenie warstwy A (FloatLayout)
A = FloatLayout(size_hint=(None, None), size=(400, 400), pos=(150, 50))

# Tworzenie warstwy B (FloatLayout)
B = FloatLayout(size_hint=(None, None), size=(70, 40), pos_hint={'x': .15, 'y': .51})

# Button ustawiony na pełne wypełnienie bo canvas usawiany 'absolutnie' (x,y) nie działa
C = Button(text = 'Push', size_hint = (1,1), pos_hint={'x': 0, 'y': 0})

# Dodawanie tła dla warstwy A (czerwone)
with A.canvas.before:
  Color(.7, 0, 0, 1)
  Rectangle(pos=A.pos, size=A.size)

# Button do warstwy B
B.add_widget(C)

# Dodawanie warstwy B do warstwy A
A.add_widget(B)

# to wszystko dodane do pierwszej warstwy
MAIN.add_widget(A)

runTouchApp(MAIN)

Faktycznie,ale pozycjonowanie za pomocą x i y ( pos=(x,y) ) nie działa wewnątrz float. Trzeba użyć pos_hint = {'x': .1, 'y': .1}
Button size_hint=(1,1) dodałem jako wypełnienie zamiast koloru canvas bo dla canvas trzeba śledzić pozycję.
Pewnie trzeba by było obserwować/odczytać pozycję rodzica i ustawiać piksele, ale wciąż od lewego dołu całości.

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