我正在研究一个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轴上)?
你可以添加GUI的快照,我正在寻找类似于你已经实现的东西 – 2016-03-03 11:21:06