2017-10-12 47 views
5

Próbuję utworzyć widżet kivy z Scatter, który można dowolnie powiększać, ale po podniesieniu przycisku myszy następuje powrót do najbliższego poziomu powiększenia.Zmodyfikowany widżet rozproszenia kivy nie aktualizuje transformacji

Działa, ale nie aktualizuje powiększenia do następnego kliknięcia. Wydaje mi się, że muszę powiązać pewne wydarzenie tutaj, ale jestem całkiem nowy w kivy i nie mogę tego rozgryźć. Tu jest mój bieżący kod:

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

Obecnie jestem powiększanie przez „gestów”: Kliknij prawym przyciskiem myszy, aby umieścić pierwszy palec, a następnie przeciągnąć lewym przyciskiem myszy (w systemie Linux) –

+0

To jest dokładnie to, co robi się na Linuksie, ale chcę, żeby zmieniło skalę na jeden z moich stałych poziomów powiększenia po zwolnieniu przycisku myszy (zobacz pierwsze zdanie mojego pytania) –

+0

Na moim Ubuntu ten kod działa, ale jeden na dwóch nie może również aktualizować, może to być błąd – MatEhickey

Odpowiedz

1
self.transform.set(# ... 

Problem jest to, że można modyfikować istniejące ObjectProperty instancji i Kivy nie wie, że zmieniło:

Ostrzeżenie Aby oznaczyć właściwość jako zmieniony, należy przypisać nowy obiekt Pythona.

Można też to zrobić albo, na przykład, wysyłki ręcznie:

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

Spójrz na tej metodzie https://kivy.org/docs/api-kivy.uix.scatter.html#kivy.uix.scatter.Scatter.apply_transform

Można przepisać set_zoom podobną do

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

jeśli podzielić przez old_zoom i pomnożyć żądany należy uzyskać prawy powiększ, ponieważ wydaje się być multiplikatywny.

Here to kolejny pomocny link, w którym współpracują ze Scatter i optymalizują go na komputerze.