2013-04-20 42 views
1

我正在研究一個kivy應用程序,它從sqlite3數據庫中提取數據並使用它填充一個TreeView。當我展開一些組時,TreeView變得太大而不適合放在我的屏幕上,所以我想將它放在ScrollView中,這樣我仍然可以向下滾動並查看已離開屏幕底部的項目。我可以得到一個基本的ScrollView來工作,但是當我把它放在TreeView裏面的時候,沒有滾動,我的TreeView的頂部不在屏幕的頂部。Kivy ScrollView中的TreeView - No Scroll

我已經下調了代碼到,如果沒有一個.kv文件運行這個問題的工作示例:

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() 

在我的實際應用,modGroups和modItems從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) 

然後我就可以得到一個工作當我使用我的鼠標的滾輪時,滾動視圖的滾動條在右側。

我最好的猜測是,TreeView不會告訴ScrollView它的垂直時間有多長,所以ScrollView沒有意識到它需要在Y軸上滾動。雖然這只是一個猜測。

我怎樣才能讓TreeView在ScrollView中工作,這樣我就可以通過我的TreeView滾動(特別是在y軸上)?

+0

你可以添加GUI的快照,我正在尋找類似於你已經實現的東西 – 2016-03-03 11:21:06

回答

4

a)只爲一個孩子使用GridLayout,pease不。我會認爲這是從何時/如果你添加更多的孩子時剩下的。

b)TreeView的文檔聲明它具有minimun_height屬性,它指示容納所有兒童所需的最小寬度/高度。根據孩子的數量,Treeview不會自行更改高度。您應該更新(在這種情況下)TreeView的身高給它的minimum_height ... tv.bind(minimum_height=tv.setter('height')) 三)考慮到上述各點所提供的信息,你可以做::

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然後它將滾動。喜歡這個。

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