2017-06-11 1 views
0

Ich habe gerne mehrere Klassen dank x Kommunikation ist ein Objekt der Klasse foo:einen Wert aus einer Klasseneigenschaft in Kivy Python abwartend

class foo(EventDispatcher): 
    def variable_input(self, *args): 
     self.a='This is an observed value being changed' 

    def __init__(self): 
     self.a=StringProperty('') 

jetzt erstelle ich ein Objekt X eine Instanz der Klasse foo ist

X=foo() 

ich habe einen Screen als Teil eines ScreenManager eine Label mit ID vystup

enthaltend
class Hlavne(Screen): 
    pass 

Was ich versuche zu tun, ist die Funktion on_propname mit X.a als Propname schreiben. Wie zeige ich auf den Wert, der zur Instanz einer anderen Klasse gehört.

Ich habe gelesen:

Warnung

Vorsicht mit ‚on_‘. Wenn Sie einen solchen Callback für eine Eigenschaft erstellen, die Sie erben, dürfen Sie nicht vergessen, auch die Superklassenfunktion aufzurufen.

Aber wie es mit kivys Dokumentation üblich ist, sagt es Ihnen nicht wie.

Antwort

0

Kivy-Eigenschaften sind unter Klasse Ebene deklariert, nicht in einer Instanz. (Bad)

def __init__(self): 
    self.a=StringProperty('') 

Bindung zu eine Eigenschaft und mit einem on_property Ereignisse sind zwei verschiedene Dinge.

from kivy.clock import Clock 
from kivy.base import runTouchApp 
from kivy.uix.widget import Widget 
from kivy.properties import NumericProperty 


class Test(Widget): 
    hop = NumericProperty(0) 

    def __init__(self, **kwargs): 
     super(Test, self).__init__(**kwargs) 
     Clock.schedule_interval(
      lambda *dt: setattr(self, 'hop', self.hop + 1), 0.1 
     ) 

     # bind to property 
     self.bind(hop=self.bind_hop) 

    def on_hop(self, instance, value): 
     # no event, no super() necessary 
     # unless inherrited from "Test" 
     print('on_hop:', instance, value) 

    def bind_hop(self, instance, value): 
     print('bind_hop:', instance, value) 

runTouchApp(Test()) 

Sie können in jeder der Funktion mit isinstance für eine Instanz überprüfen, weil der instance Argument übergeben in jedem Ereignis/bind eines Kivy Eigenschaft erwähnt here.

+0

Ich werde morgen überprüfen, ich gebe zu, als ein neuer Python-Benutzer, finde ich es schwierig zu verstehen Syntax von Super. Danke für jetzt – Tomas

+0

@Tomas Nun, grob gesagt, stellen Sie sich eine Klasse 'A' mit einer Methode' A.x' vor. Jetzt erstellen Sie eine weitere Klasse 'B' mit der gleichnamigen Methode' B.x'. Da "B" von "A" erbt, kann es auf alles (hauptsächlich) von der Klasse "A", also sogar die "x" -Methode zugreifen, jedoch überschreiben Sie mit dem Erstellen von "B.x" den Inhalt der vererbten "A.x" -Methode. Um das Überschreiben zu stoppen, dh selbst den Code von'Ax' auszuführen, nennt man 'super (aktueller Klassenname, aktuelle Instanz) .method (args)' was in diesem speziellen Fall 'super (B, self) .x() wäre. '. Auf diese Weise können Sie 'A.x' vor oder nach dem neuen' B.x' Code ausführen. – KeyWeeUsr

+0

@Tomas siehe https://Stackoverflow.com/documentation/python/419/classes/3912/multiple-inheritance für mehr, gibt es nützliche Beispiele. :) – KeyWeeUsr

Verwandte Themen