2013-04-20 207 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