Variable in Klassenmethode

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Natz
User
Beiträge: 18
Registriert: Montag 30. Dezember 2013, 18:03

Hallo zusammen,
ich versuche im folgenden Script in der methode check_filter() die Variable labelfilter und image6 aus der methode __init__() zu benutzen.
Leider bin ich nur erfolgreich mit dem deklarieren einer Globalen variable in der __init__ methode. Das möchte ich natürlich nicht!
Wie gebe ich so eine Variable weiter?
Bin schon seit Tagen am googeln aber leider ohne Erfolg! :K Steige auch ehrlich gesagt nicht so ganz durch OOP durch.
Über Hilfe wäre ich wirklich sehr dankbar!!!
Gruß Natz

Code: Alles auswählen


class Class():
    def __init__(self):
        builder = Gtk.Builder()  
        builder.add_from_file("GUI.glade")
        builder.connect_signals(self)
        labelfilter = builder.get_object("labelfilter")
        image6 = builder.get_object("image6")
    
    def obj(self, name):
        ##Gibt Glade-Object 'name' zurück
        return self.builder.get_object(name)
        
    def run(self):
        ##Startet die zentrale Warteschleife von Gtk
        try:
            Gtk.main()
        except KeyboardInterrupt:
            pass
    
    def quit(self):
        ## Verlässt die zentrale Warteschleife von Gtk
        Gtk.main_quit()
        
    def on_window1_delete_event(self, *args):
        self.quit()
        
    def check_filter():						
        input_value1 = GPIO.input(13)
        if input_value1 == 1:
            labelfilter.set_markup("<span foreground='green'>OK</span>")					#funktioniert nur mit Globale Variable
            image6.hide()
        else:
            labelfilter.set_markup("<span foreground='#ff0000'>Nachfüllen !!</span>")
            image6.show()
            sleep (0.2)
        return True
    GLib.timeout_add_seconds(13, check_filter)
    
if __name__ == '__main__':
    app = Class()
    app.run()
    exit()
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

So ganz verstehe ich dein Problem nicht.

check_filter tut so natuerlich nicht. Da fehlt das self. Und damit kann es doch auf Attribute von self zugreifen. Das scheduling mit dem Timer muss dann natuerlich auch in __init__ zB stattfinden.
Natz
User
Beiträge: 18
Registriert: Montag 30. Dezember 2013, 18:03

hi deets,
danke erstmal für die Antwort.
wenn ich es so schreibe check_filter(self) dann kommt halt eine Fehlermeldung takes 1 argumet (0given).
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil du das Scheduling falsch machst. Du musst schon "self.check_filter" als Callback registrieren. Das ist dann eine "gebunden Methode" (bound method), und damit kannst du dann arbeiten. Aber dazu muss

Code: Alles auswählen

 GLib.timeout_add_seconds(13, check_filter)
anders aussehen -

Code: Alles auswählen

GLib.timeout_add_seconds(13, self.check_filter)
, und das kann dann auch nicht so wie bei dir auf Klassen-Ebene stehen, sondern muss eben in __init__ verschoben werden.
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Hallo,

schau dir am besten die OOP für Python nochmal an. Da draußen gibt es viele gute Tutorial und/oder Videos.
Ich lasse dir mal ein Codefetzen da.

Code: Alles auswählen

class Class():
    def __init__(self):
        ...
        self.labelfilter = builder.get_object("labelfilter")
        ...
   ...
   
    def check_filter(self): 
        input_value1 = GPIO.input(13)
        if input_value1 == 1:
            self.labelfilter.set_markup("<span foreground='green'>OK</span>")
            ...

Natz
User
Beiträge: 18
Registriert: Montag 30. Dezember 2013, 18:03

Hi,
danke für eure Hilfe! - läuft jetzt alles :wink:
An das self im scheduler habe ich gar nicht gedacht! :roll:

Danke!!!
Antworten