2013-09-26 67 views
4

我在使用ScollView Widget嘗試製作動態生成的標籤滾動堆棧時遇到了一些問題。有可能我誤解了ScrollView的使用方式,所以我希望有人能爲我澄清一下。下面的代碼從csv中讀取一堆數據,當顯示代碼時,如果有大量數據,程序將基本上嘗試將所有文​​本/標籤壓縮到GridLayout中。我希望數據可以滾動。這是一個抽象版本的代碼:ScrollView小部件不在kivy中滾動

class showData(Screen): 
def __init__(self, **kwargs): 
    super(showData, self).__init__(**kwargs) 

    self.my_data = read_csv_to_dict() 
    self.data_exists = 0 if len(self.my_data) == 0 else 1 

    ### Create Widgets ###  
    layout_main = BoxLayout(orientation = 'vertical') 
    layout_back_button = BoxLayout(padding = [0, 0, 0, 20]) 
    self.layout_data = GridLayout(cols = 3 if self.data_exists else 1) 
    self.scrollview_data = ScrollView() 

    button_back = Button(text = 'Main menu') 

    ### Add widgets ### 
    self.add_widget(layout_main) 
    layout_main.add_widget(layout_back_button) 
    layout_main.add_widget(self.scrollview_data) 

    layout_back_button.add_widget(button_back) 

    if self.data_exists: 
     self.layout_data.add_widget(Label(text = 'label 1')) 
     self.layout_data.add_widget(Label(text = 'label 2')) 
     self.layout_data.add_widget(Label(text = 'label 3')) 
     self.display_data(self) 
     self.scrollview_data.add_widget(self.layout_data) 
    else: 
     self.scrollview_data.add_widget(Label(text = 'Records are empty')) 

    ### Create button bindings ### 
    button_back.bind(on_press = switch_screen_to_main)  

def display_data(obj, self): 

    data_dictReader = read_csv_to_dictReader() 

    for data_row in data_dictReader: 
     for value in data_row.values(): 
      self.layout_data.add_widget(Label(text = value)) 

GridLayout/data不可滾動。有人能告訴我如何修復上面的代碼,使其可滾動?謝謝。

回答

8

您在GridLayout上缺少a few things from the Kivy Documentation。他們是必要的,以確保該網格佈局是「大到足以滾動」:

  1. 你一定會確保您設置的size_hint_yNone,因爲默認1是不是在這種情況下
  2. 綁定方便GridLayoutminimum_heightlayout.setter('height')
  3. 要確保ScrollView具有合適的尺寸,以適應滾動

這個例子是非常多,你的文檔中查找:

from kivy.app import App 
from kivy.uix.scrollview import ScrollView 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.button import Button 

class Example(App): 

    def build(self): 
     layout = GridLayout(cols=1, spacing=10, size_hint_y=None) 
     # Make sure the height is such that there is something to scroll. 
     layout.bind(minimum_height=layout.setter('height')) 
     for i in range(30): 
      btn = Button(text=str(i), size_hint_y=None, height=40) 
      layout.add_widget(btn) 
     root = ScrollView() 
     root.add_widget(layout) 
     return root 

if __name__ == '__main__': 
    Example().run() 

在這個例子中,ScrollView是大小的Window,但您可以使用size_hintsize屬性來操作它。

+0

經過與上面提到的各種屬性爭吵後,它的工作。謝謝! –