2017-10-12 46 views
5

我嘗試從Scatter創建一個可自由縮放的kivy控件,但是一旦鼠標按鈕被擡起,就會回落到最近的縮放級別。修改後的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() 
+0

目前,我通過「手勢」縮放:右擊把第一根指頭,然後用鼠標左鍵拖動(在Linux上) –

+0

這正是它在Linux上所做的,但我希望它在釋放鼠標按鈕後將縮放比例更改爲我的固定縮放級別之一(請參閱我的問題的第一句) –

+0

在我的Ubuntu上,此代碼可以工作,它不能更新,實際上它可能是一個錯誤 – MatEhickey

回答

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 
1

在這種方法https://kivy.org/docs/api-kivy.uix.scatter.html#kivy.uix.scatter.Scatter.apply_transform

你可以,如果你除以old_zoom改寫set_zoom類似

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

,並期望你應該得到的乘看看右邊 放大,因爲它似乎是乘法。

Here是另一個有用的鏈接,在那裏他們與Scatter一起工作併爲桌面優化。這裏