2013-10-06 13 views
6

Próbuję zbudować podstawową aplikację Kivy. Po dodaniu podstawowych elementów i uruchomieniu aplikacji wszystkie elementy są wciśnięte w lewy dolny róg. Pojawia się w ten sposób na Androidzie i Linuksie.Kivy - aplikacja bazowa ma dziwne wyrównanie

Main.py:

from kivy.app import App 
from kivy.uix.widget import Widget 

class SublimeLauncher(Widget): 
    pass 

class SublimeLauncherApp(App): 
    def build(self): 
     return SublimeLauncher() 

if __name__ == "__main__": 
    SublimeLauncherApp().run() 

sublimelauncher.kv:

#:kivy 1.2.0 
<SublimeLauncher>: 
    FloatLayout: 
     BoxLayout: 
      orientation: 'vertical' 
      spacing: 10 
      Label: 
       text: "Enter the path to the folder to open.\nPress OK if you would like to open without a directory" 
      TextInput: 
       id: folderpath 
      Button: 
       text: 'OK' 

raz pierwszy próbowałem go tylko z BoxLayout, ale czytałem gdzieś widget korzeniem jest zawsze tak duża, jak w aplikacji. Jak zadeklarować rozmiar aplikacji? Lub układ? Jak byś zrobił coś w stylu okna dialogowego?

Może brakuje mi czegoś bardzo prostego, ale nie mogę tego zrozumieć.

Edycja: tutaj jest to, co ja widzę ..

enter image description here

Odpowiedz

4

Jak widżetu korzeniowego nie jest układem (zrobiłeś SublimeLauncher dziedziczy Widget), to nie ustawia jego rozmiar/pozycje dzieci. Więc twoje FloatLayout mają ustawienia domyślne, ponieważ nie zastąpisz ich ręcznie.

pos: 0, 0 
size: 100, 100 

I te domyślne z ograniczeniami oczywiście dzieci, ponieważ FloatLayout przez ograniczenie ich wielkość na podstawie ich size_hint nieruchomości.

Chcesz dać im więcej miejsca, jak zauważył Nykakin.

Ponadto, ponieważ tekst jest większy niż etykieta (nie ustawiono również halign i text_size), jego tekst jest wyśrodkowany na środku etykiety, a więc pewna jego część jest poza ekranem. Chcesz rzucić okiem na kivy/examples/widgets/textalign.py

5

Twój układ ma domyślny rozmiar 100x100 pikseli. Można spróbować go pokolorować, aby zobaczyć, ile miejsca zajmuje:

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.lang import Builder 

kv = ''' 
<SublimeLauncher>: 
    BoxLayout: 
     canvas: 
      Color: 
       rgb: 1, 0, 0 
      Rectangle: 
       size: self.size 
     orientation: 'vertical' 
     spacing: 10 
     Label: 
      text: "Enter the path to the folder to open.\\nPress OK if you would like to open without a directory" 
     TextInput: 
      id: folderpath 
     Button: 
      text: 'OK' 
''' 
Builder.load_string(kv) 

class SublimeLauncher(Widget): 
    pass 

class SublimeLauncherApp(App): 
    def build(self): 
     return SublimeLauncher() 

if __name__ == "__main__": 
    SublimeLauncherApp().run() 

Ustawianie niż domyślny rozmiar:

kv = ''' 
<SublimeLauncher>: 
    BoxLayout: 
     size: 250, 250 
     canvas: 
      Color: 
       rgb: 1, 0, 0 
      Rectangle: 
       size: self.size 
     orientation: 'vertical' 
     spacing: 10 
     Label: 
      text: "Enter the path to the folder to open.\\nPress OK if you would like to open without a directory" 
     TextInput: 
      id: folderpath 
     Button: 
      text: 'OK' 
''' 
Builder.load_string(kv) 

Biorąc pełną przestrzeń:

kv = ''' 
<SublimeLauncher>: 
    BoxLayout: 
     size: root.size 
     canvas: 
      Color: 
       rgb: 1, 0, 0 
      Rectangle: 
       size: self.size 
     orientation: 'vertical' 
     spacing: 10 
     Label: 
      text: "Enter the path to the folder to open. \\nPress OK if you would like to open without a directory" 
     TextInput: 
      id: folderpath 
     Button: 
      text: 'OK' 
''' 
Builder.load_string(kv) 
+0

Są to zarówno dobre odpowiedzi.Po prostu zdecydowałem, że druga odpowiedź wyjaśniła to nieco lepiej. Dziękuję za przykłady. – sjensen85

5

Ostatnio napisałem a post małego triku, którego używam, kiedy programuję interfejsy. Ta sztuczka pozwoli ci zobaczyć granicę wokół wszystkich widżetów (włącznie z układami) dodawanych do ekranu. Byłby to wynik o kodzie:

enter image description here

Wykorzystuje dziedziczenia oraz zasad Kivy nadpisać klasę bazową wszystkich widżetów. Po prostu trzeba dodać:

<Widget>: 
    canvas.after: 
     Line: 
      rectangle: self.x+1,self.y+1,self.width-1,self.height-1 

na początku tego pliku:

<SublimeLauncher>: 
    FloatLayout: 
     BoxLayout: 
      orientation: 'vertical' 
      spacing: 10 
      Label: 
       text: "Enter the path to the folder to open.\nPress OK if you would like to open without a directory" 
      TextInput: 
       id: folderpath 
      Button: 
       text: 'OK'