2017-05-03 1 views
0

Kivy를 처음 접해서 gridLayout에 항목을 추가하는 문제에 봉착했습니다. 항목은 내 파이썬 클래스에서 만들어지며 내 kv 파일에서 내 gridlayout을 채우고 싶습니다. 작동하지만 라벨이 같은 위치에 추가됩니다 (즉, 라벨이 열에 없음 - 모두 하나의 셀에 있음). 나는 here에서 해결책을 시도했지만, 나는 아직도 잘못 알고있다.python 코드로 생성 된 위젯을 kv 파일에 추가하는 방법

KV 파일 :

#:kivy 1.9.1 

<Connected>: 

    BoxLayout: 
     orientation: 'vertical' 

     Label: 
      text: 'main window' 
      font_size: 32 

     BoxLayout: 
      orientation: 'vertical' 

      Label: 
       text: 'Flights' 
       font_size: 32 

      BoxLayout: 
       orientation: 'horizontal' 
       Label: 
        text: 'From' 
        font_size: 32 
       Label: 
        text: 'To' 
        font_size: 32 
       Label: 
        text: 'Company' 
        font_size: 32 
       Label: 
        text: 'Date' 
        font_size: 32 

      ScrollView: 
       size_hint_y: None 
       height: '200dp' 

       GridLayout: 
        id: flights_table 
        col: 4 
        size_hint_y: None 
        spacing: '1dp' 

      Button: 
       text: "Buy a ticket" 
       font_size: 32 
       on_press: root.order_flight() 

      Button: 
       text: "Logout" 
       font_size: 24 
       on_press: root.disconnect() 

파이썬 코드 :

# coding: utf-8 
import json 
import requests 
from kivy.adapters.dictadapter import (
    DictAdapter, 
    ListAdapter, 
) 
from kivy.properties import (
    ListProperty, 
    ObjectProperty, 
) 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.label import Label 
from kivy.uix.screenmanager import (
    Screen, 
    SlideTransition, 
) 
from kivy.uix.listview import ListItemButton 


class Connected(Screen): 
    u"""Screen after login in.""" 

    flights = ListProperty() 

    def on_pre_enter(self, *args): 
     u"""Method that loads before the screen is loaded.""" 
     self.flights = self.get_flights() 

     for flight in self.flights: 
      for value in [flight.get('from_city'), flight.get('to_city'), flight.get('company'), flight.get('flight_date')]: 
       self.ids.flights_table.add_widget(Label(text=value)) 

    def disconnect(self): 
     u"""Logout method.""" 
     self.manager.transition = SlideTransition(direction="right") 
     self.manager.current = 'login' 
     self.manager.get_screen('login').resetForm() 

    def get_flights(self): 
     u"""Method that gets the flights from a rest api.""" 
     response = requests.get('http://127.0.0.1:8000/flights/', params={'format': 'json'}) 
     if response.status_code == 200: 
      data = None 
      try: 
       data = json.loads(response.content.decode('utf-8')) 
      except ValueError as err: 
       raise 
      return data 
     return list() 

답변

1

내 문제가 해결 있어요. 나는 그리드 레이 아웃을 만드는 방법을 바꾸었다. 내 .kv 파일에서 눈금을 작성하는 대신 내 ScrollView의 ID를 얻고 여기에 gridlayout을 추가합니다. Kivy에서 경고 나에게 조금 도움이 : 0x7ff7ac893a60에서

[경고] kivy.uix.gridlayout.GridLayout 객체가 더 COLS 또는 설정 행이없고, 레이아웃이 트리거되지 않습니다.

또한 Kivy documentation은 나에게 힌트를주었습니다.

그래서 내 코드는 다음과 지금 :

.kv 파일 :

#:kivy 1.9.1 

<Connected>: 

    BoxLayout: 
     orientation: 'vertical' 

     Label: 
      text: 'Main panel' 
      font_size: 32 

     BoxLayout: 
      orientation: 'vertical' 

      Label: 
       text: 'Flights' 
       font_size: 32 

      BoxLayout: 
       orientation: 'horizontal' 
       Label: 
        text: 'From' 
        font_size: 32 
       Label: 
        text: 'To' 
        font_size: 32 
       Label: 
        text: 'company' 
        font_size: 32 
       Label: 
        text: 'Data' 
        font_size: 32 

      ScrollView: 
       id: scroll_view 
       size_hint_y: None 
       height: '200dp' 


      Button: 
       text: "Order a ticket" 
       font_size: 32 
       on_press: root.order_flight() 

      Button: 
       text: "Logout" 
       font_size: 24 
       on_press: root.disconnect() 

파이썬 코드 :

# coding: utf-8 
import json 
import requests 
from kivy.adapters.dictadapter import (
    DictAdapter, 
    ListAdapter, 
) 
from kivy.properties import (
    ListProperty, 
    ObjectProperty, 
) 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.label import Label 
from kivy.uix.screenmanager import (
    Screen, 
    SlideTransition, 
) 
from kivy.uix.listview import ListItemButton 
from requests.exceptions import ConnectionError 

class Connected(Screen): 
    u"""Screen after login in.""" 

    flights = ListProperty() 

    def on_pre_enter(self, *args): 
     u"""Method that loads before the screen is loaded.""" 
     self.flights = self.get_flights() 

     scroll = self.ids.scroll_view 
     scroll.clear_widgets() 
     grid = GridLayout(cols=4, size_hint_y=None, spacing='1dp') 
     # grid.bind(minimum_height=grid.setter('height')) 
     for flight in self.flights: 
      for value in [flight.get('from_city'), flight.get('to_city'), flight.get('company'), flight.get('flight_date')]: 
       grid.add_widget(Label(text=value)) 
     scroll.add_widget(grid) 

    def disconnect(self): 
     u"""Logout method.""" 
     self.manager.transition = SlideTransition(direction="right") 
     self.manager.current = 'login' 
     self.manager.get_screen('login').resetForm() 

    def get_flights(self): 
     u"""Method that gets the flights from a rest api.""" 
     try: 
      response = requests.get('http://127.0.0.1:8000/flights/', params={'format': 'json'}) 
     except ConnectionError: 
      raise 
     if response.status_code == 200: 
      data = None 
      try: 
       data = json.loads(response.content.decode('utf-8')) 
      except ValueError as err: 
       raise 
      return data 
     return list() 
관련 문제