修改的kivy散点小部件不会更新转换

时间:2017-10-12 23:58:22

标签: python kivy

我尝试从Scatter创建一个kivy小部件,它可以自由缩放,但是一旦鼠标按钮被抬起就会回落到最接近的缩放级别。

它可以工作,但在下次点击之前它不会更新缩放。我想我需要在这里绑定一些事件,但我对kivy很新,并且无法弄明白。这是我目前的代码:

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.scatter import Scatter
from kivy.graphics.transformation import Matrix

ZOOM_LEVELS = [0.25, 0.5, 1, 2, 4]

class PPMap(Scatter):
    def __init__(self, **kwargs):
        super(PPMap, self).__init__(**kwargs)
        self.bind(on_touch_up=self.adjust_zoom)

    def adjust_zoom(self, *args):
        old_zoom = self.scale
        new_zoom = min(ZOOM_LEVELS, key=lambda x:abs(x-old_zoom))
        self.set_zoom(new_zoom)

    def set_zoom(self, zoom):
        self.transform.set(array=[[zoom, 0, 0, 0],
                                  [0, zoom, 0, 0],
                                  [0, 0, zoom, 0],
                                  self.transform.tolist()[3]])

class PPApp(App):
    def build(self):
        pp_map = PPMap(do_rotation=False, scale_min=ZOOM_LEVELS[0], scale_max=ZOOM_LEVELS[-1])
        label = Label(text="Hello!", font_size=300, pos=(0, 0))
        pp_map.add_widget(label)
        return pp_map

if __name__ == "__main__":
    PPApp().run()

2 个答案:

答案 0 :(得分:1)

看看这个方法https://kivy.org/docs/api-kivy.uix.scatter.html#kivy.uix.scatter.Scatter.apply_transform

您可以重写与{/ p>类似的set_zoom

def set_zoom(self, new_zoom, old_zoom):
    zoom = new_zoom / old_zoom
    self.apply_transform(Matrix().scale(zoom, zoom, zoom))

如果你除以old_zoom并乘以所需,你应该得到正确的  因为它似乎是倍增的缩放。

Here是另一个有用的链接,他们使用Scatter并针对桌面进行优化。

答案 1 :(得分:1)

self.transform.set( # ...

问题在于您修改了现有的ObjectProperty实例,而Kivy并不知道它已更改:

  

警告要将属性标记为已更改,您必须重新分配新属性   python对象。

您可以这样做,或者,例如,手动发送:

def set_zoom(self, zoom):
    self.transform.set(array=[[zoom, 0, 0, 0],
                              [0, zoom, 0, 0],
                              [0, 0, zoom, 0],
                              self.transform.tolist()[3]])
    self.property('transform').dispatch(self)  # transform has changed