if Anweisung platzieren für GPIO Abfrage

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

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
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. :-)
Natz
User
Beiträge: 18
Registriert: Montag 30. Dezember 2013, 18:03

@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.
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.
Natz
User
Beiträge: 18
Registriert: Montag 30. Dezember 2013, 18:03

@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 .
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Natz
User
Beiträge: 18
Registriert: Montag 30. Dezember 2013, 18:03

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
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
diesch
User
Beiträge: 80
Registriert: Dienstag 14. April 2009, 13:36
Wohnort: Brandenburg a.d. Havel
Kontaktdaten:

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)
http://www.florian-diesch.de
Natz
User
Beiträge: 18
Registriert: Montag 30. Dezember 2013, 18:03

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.
BlackJack

@Natz: Ja das liegt daran das `self` nicht einfach so aus dem nichts kommt. Vielleicht solltest Du noch mal OOP-Grundlagen durchgehen. :-)
Natz
User
Beiträge: 18
Registriert: Montag 30. Dezember 2013, 18:03

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")
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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Natz
User
Beiträge: 18
Registriert: Montag 30. Dezember 2013, 18:03

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.
Natz
User
Beiträge: 18
Registriert: Montag 30. Dezember 2013, 18:03

Keiner ein Link oder Beispiel?
Dann schliess das Dingen hier !
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Antworten