测试应用程序摘要:我正在编写一个带有可滚动视图(名为Scroller
)的 Kivy 应用程序,其中包含许多要查看的字段(名为Field
)。这些单独的字段有时真的很难区分,所以我决定为每个字段使用交替的背景颜色来帮助区分彼此。我的测试应用程序使用 20 个单独的字段,每个字段在深灰色和深灰色之间交替。
测试试验: 启动应用程序,程序看起来很棒。交替的背景看起来很好。即使我向下滚动应用程序看起来也很好。但是,当我向上滚动应用程序时,应用程序似乎变得很奇怪。文本随应用程序滚动,但背景不滚动。更好的是(讽刺地),文本开始消失在他们的邻居背景中。当我再次向下滚动(通过最远向上滚动点的点)时,问题似乎消失了。
简要问题描述: 的Field
“背景颜色”在向上滚动事件期间弄乱了应用程序。
旁注:我还注意到应用程序在滚动太多后变得有点迟钝。我对 Kivy 的绘制周期不是很熟悉,但是 blitting 背景不应该导致过度减速。
测试应用:
import kivy
kivy.require('1.0.7')
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.graphics import Color, Rectangle
class Main(App):
def build(self):
self.root = GridLayout(rows = 1)
self.root.add_widget(Scroller())
return self.root
class Scroller(ScrollView):
def __init__(self):
ScrollView.__init__(self)
self.view = GridLayout(cols = 1, size_hint = (1, None))
self.add_widget(self.view)
self.view.bind(minimum_height = self.view.setter('height'))
for i in range(20):
self.view.add_widget(Field('Test field {}'.format(i),i%2 is 0))
class Field(GridLayout):
def __init__(self, name, bg):
assert isinstance(name, str)
assert isinstance(bg, bool)
self.bg = bg
GridLayout.__init__(self,
rows = 1,
padding = 10,
size = (0, 60),
size_hint = (1, None))
self.add_widget(Label(text = name))
self.add_widget(Button(text = 'Test button',
size = (200, 0),
size_hint = (None, 1)))
self.bind(pos = self.change_background)
self.bind(size = self.change_background)
def change_background(self, *args):
with self.canvas.before:
if self.bg:
Color(0.2, 0.2, 0.2, mode = 'rgb')
else:
Color(0.1, 0.1, 0.1, mode = 'rgb')
Rectangle(pos = self.pos, size = self.size)
if __name__ in ('__main__', '__android__'):
app = Main()
app.run()