2013-04-20 3 views
1

저는 sqlite3 데이터베이스에서 데이터를 가져 와서 TreeView를 채우는 kivy 앱을 만들고 있습니다. 일부 그룹을 확장 할 때 TreeView가 너무 커서 화면에 맞지 않게되므로 ScrollView 내부에 넣으므로 아래로 스크롤하여 화면 아래쪽에있는 항목을 볼 수 있습니다. 기본 ScrollView 작동하도록 얻을 수 있지만 내부에 내 TreeView 넣을 때 아무 스크롤 및 내 TreeView 위쪽 부분이 내 화면 맨 위에 있습니다.Kivy에서 ScrollView의 TreeView - 스크롤하지 않습니다.

은 내가 .kv 파일없이 실행 문제의 작동 예에 코드를 손질 한 내 실제 앱 modGroups 및 modItems에서

from kivy.uix.scrollview import ScrollView 
from kivy.uix.gridlayout import GridLayout 
from kivy.core.window import Window 
from kivy.uix.widget import Widget 
from kivy.uix.treeview import TreeView, TreeViewNode 
from kivy.uix.treeview import TreeViewLabel 
from kivy.app import App 
from kivy.properties import ObjectProperty, StringProperty 
from kivy.uix.button import Button 

class TreeViewButton(Button, TreeViewNode): 
    pass 

modGroups = [u'Fruit', u'Fruit', u'Meat', u'Dairy', u'Dairy', u'Fruit'] 
modItems = [u'Apple', u'Pear', u'Spam', u'Egg', u'Milk', u'Banana'] 
modDict = dict() 
modDictUnique = dict() 

def populate_tree_view(tv): 
    modDict = zip(modGroups, modItems) 
    print modGroups 
    print modItems 
    for k, v in modDict: 
     if k not in modDictUnique: 
      modDictUnique[k] = [v] 
     else: 
      modDictUnique[k].append(v) 
    sortedGroups = modDictUnique.keys() 
    sortedGroups.sort() 
    #print modItems 
    #print modDictUnique 
    n = tv.add_node(TreeViewLabel(text='Food', is_open=True)) 
    for group in sortedGroups: 
     g = tv.add_node(TreeViewLabel(text='%s' % group), n) 
     for item in modDictUnique[group]: 
      tv.add_node(TreeViewButton(text='%s' % item), g) 

class POSFMApp(App): 

    def build(self): 
     layout = GridLayout(cols=1, spacing=50, size_hint_y=None,width=800) 
     layout.bind(minimum_height=layout.setter('height')) 
     #for i in range(30): 
     # btn = Button(text=str(i), size=(480, 40), 
     #     size_hint=(None, None)) 
     # layout.add_widget(btn) 
     tv = TreeView(root_options=dict(text='Tree One'), hide_root=True, indent_level=4, minimum_height=5000) 
     populate_tree_view(tv) 
     layout.add_widget(tv) 
     root = ScrollView(size_hint=(None, None), size=(800, 700)) 
     root.center = Window.center 
     root.add_widget(layout) 
     return root 

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

sqlite3를 데이터베이스에서 채워집니다 만,이 예 sqlite3을 사용하여 문제를 해결할 필요가 없습니다. 나는 (주석) 라인에 넣어 :

#for i in range(30): 
# btn = Button(text=str(i), size=(480, 40), 
#     size_hint=(None, None)) 
# layout.add_widget(btn) 

을이 kivy ScrollView example에서 나는이 라인의 주석을 해제하면 것을 보여 내 TreeView에 대한 세 줄을 주석

tv = TreeView(root_options=dict(text='Tree One'), hide_root=True, indent_level=4, minimum_height=5000) 
populate_tree_view(tv) 
layout.add_widget(tv) 

그럼 내가 작업을 얻을 수 있습니다 마우스의 스크롤 휠을 사용할 때 예상대로 오른쪽에 스크롤 막대가있는 ScrollView.

가장 좋은 추측은 TreeView가 ScrollView에 세로 길이를 알려주지 않으므로 ScrollView가 y 축을 스크롤해야한다는 것을 알지 못한다는 것입니다. 그것은 단지 추측입니다.

어떻게 내 TreeView를 통해 스크롤 할 수 있도록 (특히 y 축에서) ScrollView 내에서 작동하도록 TreeView를 가져올 수 있습니까?

+0

GUI의 스냅 샷을 추가 할 수 있습니까? 구현 한 것과 비슷한 것을 찾고 있습니까? –

답변

4

a) 한 어린이에게만 GridLayout을 사용하면 피싱을하지 마십시오. 나는 그것이 더 많은 아이들을 그곳에 추가 할 때부터 남겨 두었던 것을 떠올리게하겠다.

b) 설명서에는 minimun_height이라는 속성이 있으며, 모든 자식을 보유하는 데 필요한 최소 너비/높이를 나타냅니다. Treeview은 아이들의 수에 따라 높이가 변경되지 않습니다. 이 계정에 위의 지점에서 제공하는 정보를 복용) minimum_height ... tv.bind(minimum_height=tv.setter('height')) C를의에 당신은, (이 경우) TreeView의 높이를 업데이트해야합니다 당신은 다만 수 : 여기

tv = TreeView(root_options=dict(text='Tree One'), hide_root=True, indent_level=4) 
tv.size_hint = 1, None 
tv.bind(minimum_height = tv.setter('height')) 
populate_tree_view(tv) 
root = ScrollView(pos = (0, 0)) 
root.add_widget(tv) 

전체 코드입니다 이러한 변경 사항을 포함하여 코드를 복사하여 .py 파일에 붙여넣고 실행할 수 있습니다.

from kivy.uix.scrollview import ScrollView 
from kivy.uix.gridlayout import GridLayout 
from kivy.core.window import Window 
from kivy.uix.widget import Widget 
from kivy.uix.treeview import TreeView, TreeViewNode 
from kivy.uix.treeview import TreeViewLabel 
from kivy.app import App 
from kivy.properties import ObjectProperty, StringProperty 
from kivy.uix.button import Button 

class TreeViewButton(Button, TreeViewNode): 
    pass 

modGroups = [u'Fruit', u'Fruit', u'Meat', u'Dairy', u'Dairy', u'Fruit'] 
modItems = [u'Apple', u'Pear', u'Spam', u'Egg', u'Milk', u'Banana'] 
modDict = dict() 
modDictUnique = dict() 

def populate_tree_view(tv): 
    modDict = zip(modGroups, modItems) 
    print modGroups 
    print modItems 
    for k, v in modDict: 
     if k not in modDictUnique: 
      modDictUnique[k] = [v] 
     else: 
      modDictUnique[k].append(v) 
    sortedGroups = modDictUnique.keys() 
    sortedGroups.sort() 
    #print modItems 
    #print modDictUnique 
    n = tv.add_node(TreeViewLabel(text='Food', is_open=True)) 
    for group in sortedGroups: 
     g = tv.add_node(TreeViewLabel(text='%s' % group), n) 
     for item in modDictUnique[group]: 
      tv.add_node(TreeViewButton(text='%s' % item), g) 

class POSFMApp(App): 

    def build(self): 
     #for i in range(30): 
     # btn = Button(text=str(i), size=(480, 40), 
     #     size_hint=(None, None)) 
     # layout.add_widget(btn) 
     tv = TreeView(root_options=dict(text='Tree One'), hide_root=True, indent_level=4) 
     tv.size_hint = 1, None 
     tv.bind(minimum_height = tv.setter('height')) 
     populate_tree_view(tv) 
     root = ScrollView(pos = (0, 0)) 
     root.add_widget(tv) 
     return root 

if __name__ == '__main__': 
    POSFMApp().run() 
0

TreeView에 hight를 추가하면 스크롤됩니다. 이렇게

ScrollView: 
      id: kr_scroll 
      do_scroll_x: False 
      TreeView: 
       id: trvMenu 
       root_options: { 'text': 'Home', 'font_size': 15} 
       hide_root: False 
       indent_level: 4 
       size_hint_y: None 
       height: self.parent.height*2 
관련 문제