Seite 1 von 1

if Anweisung platzieren für GPIO Abfrage

Verfasst: Donnerstag 2. Januar 2014, 16:04
von Natz
Hallo,
möchte gerne ein Image in einer Glade GUI ein und ausblenden.
Die GUI wird mit self.builder.add_from_file eingelesen.
Bekomme eine 0/1 meldung von einem GPIO wo nach das Image ein bzw. ausgeblendet werden soll.

Nur wo muss ich die if-Anweisung platzieren das sie immer wieder aufgerufen wird und die GUI nicht blockiert?
Bekomme das einfach nicht hin :cry:

Gruss Natz

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Donnerstag 2. Januar 2014, 16:31
von BlackJack
@Natz: Das wird in einen eigenen Thread müssen und Du musst das „thread safe” mit der GUI kommunizieren. Was man da bei Gtk konkret für machen und beachten muss, kann ich aus dem Kopf jetzt nicht sagen. Die Dokumentation ist Dein Freund. :-)

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Donnerstag 2. Januar 2014, 16:46
von Natz
@BlackJack: Danke! Habs gerade ebend hin bekommen :oops:


Die Lösung war while Gtk.events_pending() und GTK.main_iteration() am ende der While Schleife.

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Donnerstag 2. Januar 2014, 17:13
von BlackJack
@Natz: Das ist keine gute Lösung weil das nicht skaliert. Jetzt hast Du die normale Hauptschleife durch Deine ersetzt. Spätestens wenn Du jetzt noch etwas anderes integrieren möchtest, funktioniert das nicht mehr.

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Donnerstag 2. Januar 2014, 17:42
von Natz
@BlackJack: Och nö! Ich war so Happy das ich das hin bekommen habe ;-).
Das wird in einen eigenen Thread müssen und Du musst das „thread safe” mit der GUI kommunizieren.
:shock: :K .

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Donnerstag 2. Januar 2014, 18:34
von Hyperion
Suche doch mal nach "Threading" und "PyGObject" oder "PyGtk" - je nach dem, welches Binding Du verwendest. Vermutlich wird es da bei google einige Treffer geben, die das ganze erklären :-)

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Freitag 17. Januar 2014, 16:15
von Natz
Hi,
also seit dem letzten Post sitze ich Täglich mehrere Stunden vorm Rechner und versuche das Problem zu Lösen.
Ich finde zwar genug bei Google die das erklären aber für mich nicht Plausibel.
Wenn ich die GUI zum laufen bekomme dann funktioniert die untere schleife nicht.

Code: Alles auswählen

def Thread(self):
	while True:
	    input_value = GPIO.input(10)
	    if input_value == 1:
   		self.labelfilter.set_text("OK")
		self.image6.hide()
	    else:
		self.labelfilter.set_text("Nachfüllen !!")
		self.image6.show()
Thread starten mache ich mit:

Code: Alles auswählen

if __name__ == '__main__':
        
    Th1 = Thread(target=filter)
    Th1.start()
    #GObject.threads_init()
    app = MyApp()
    app.run()
Wenn mir da einer unter die Arme greifen könnte wäre ich echt Dankbar :wink:
Benutze GObject
Gruss

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Freitag 17. Januar 2014, 21:14
von Sirius3
@Natz: wenn das da unten Dein Code ist, dann funktioniert so einiges nicht. Die Funktion Thread hat weder ein Argument target, noch ihr Rückgabewert eine Methode "start", wenn sie denn jemals etwas zurückgibt.

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Freitag 17. Januar 2014, 22:26
von diesch
Ich würde eine Funktion definieren, die den Status abfragt und die GUI entsprechend aktualisiert, und die mit
GLib.timeout_add_seconds regelmäßig aufrufen.

Also irgendwie so was:

Code: Alles auswählen

def check_gpio()
    input_value = GPIO.input(10)
    if input_value == 1:
        self.labelfilter.set_text("OK")
        self.image6.hide()
    else:
        self.labelfilter.set_text("Nachfüllen !!")
        self.image6.show()
    return True

GLib.timeout_add_seconds(60, check_gpio)

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Sonntag 19. Januar 2014, 19:10
von Natz
Hi und Danke erstmal für die Hilfe hier.
@diesch: Habe Deinen Code getestet. Leider bekomme ich immer ein global name 'self' is not defined error. Obwohl lablefilter und image6 in der Class definiert sind. :(
Liegt das an der benutzung in einer function?

Mit der print anweisung funktioniert der Code.

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Sonntag 19. Januar 2014, 19:38
von BlackJack
@Natz: Ja das liegt daran das `self` nicht einfach so aus dem nichts kommt. Vielleicht solltest Du noch mal OOP-Grundlagen durchgehen. :-)

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Montag 20. Januar 2014, 10:58
von Natz
Moin,
hmm hab mir das jetzt zig mal durchgelesen. Hab da mal wieder nen Brett vorm Kopf.
Warum ist self nicht Global definiert bzw. wie definiere ich dann self Global? :K
Sorry für diese art Fragen, aber mittlerweile drängt die Zeit.
Hab mich mit der GUI übernommen und möchte dass einfach nur noch fertig bekommen. :cry:

Hier mal mein Konstruktor:

Code: Alles auswählen

def __init__(self):
        self.builder = Gtk.Builder()  
	self.builder.add_from_file("Window.glade")
        self.builder.connect_signals(self)
    	self.labelfilter = self.builder.get_object("labelfilter")
	self.image6 = self.builder.get_object("image6")

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Montag 20. Januar 2014, 11:10
von BlackJack
@Natz: Wie sollte denn `self` global sein? Das steht für das Objekt auf dem eine Methode aufgerufen wurde. An welches der vielen Objekte die es innerhalb eines Programms gibt, sollte denn ein globales `self` gebunden sein? Soll der Rechner hellsehen und raten welches das richtige sein könnte?

Wenn Du auf die Attribute von dem Objekt mit der gezeigten `__init__()` über `self` zugreifen möchtest, dann sollte das halt keine Funktion sein, sondern eine Methode auf genau diesem Objekt. Dann ist das Objekt was Du für `self` haben möchtest das erste Argument der Methode.

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Montag 20. Januar 2014, 11:15
von EyDu
Natz hat geschrieben:Warum ist self nicht Global definiert bzw. wie definiere ich dann self Global? :K
Weil self, abhängig vom Kontext, immer ein anderes Objekt ist. Das kann man unmöglich global definieren. Wenn du den Sinn und Zweck von self nicht verstehst, und damit wohl auch nicht das Konzept von OOP, dann arbeite dich darin ein. Wenn du das nicht verstehst, dann ist jede Hilfe bei dir sinnlos, da man gleich den Code diktieren könnte. Wenn du mit GUIs arbeiten möchtest/musst , dann kommst du um OOP kaum rum.

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Montag 20. Januar 2014, 17:07
von Natz
Gebt mir doch bitte mal ein Link.
Aus den Python-Kursen und Tutorials die ich im Netz finde werde ich nicht schlau!

Ich möchte diese GUI (ist für mich privat) erstellen und dann Python wieder vergessen.
Bin ein Mensch der aus Beispielen besser Lernt als aus Texten ohne für mich sinnvolle Beispiele.
Mittlerweile bin ich an einem Punkt wo mir das Diktieren recht wäre.
Wenn ich das im eigenen Script sehe das verstehe ich das wahrscheinlich auch.

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Dienstag 21. Januar 2014, 17:41
von Natz
Keiner ein Link oder Beispiel?
Dann schliess das Dingen hier !

Re: if Anweisung platzieren für GPIO Abfrage

Verfasst: Mittwoch 22. Januar 2014, 17:46
von /me
Natz hat geschrieben:Gebt mir doch bitte mal ein Link.
Aus den Python-Kursen und Tutorials die ich im Netz finde werde ich nicht schlau!
Unter den Umständen ist ein Link wohl reichlich sinnlos.