PyQt4 ComboBox-item mit einer Funktion verbinden

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
BlackJack

@smile-1969: Du meinst `ledCombo`. Da musst Du natürlich den Namen der Combobox aus Deiner *.ui-Datei dort einsetzen. Die kenne ich ja nicht, also habe ich den Namen ”geraten”. Und wie gesagt der Code ist komplett ungetestet, kann also natürlich kleinere Fehler enthalten die man dann korrigieren müsste.

`gksudo` braucht man dafür eigentlich nicht, denn im Terminal kannst Du doch ein normales ``sudo`` ausführen. `gksudo` ist ja nur ein grafisches Frontend für ``sudo`` wenn man *kein* Terminal hat in dem man das starten kann.
smile-1969
User
Beiträge: 20
Registriert: Sonntag 22. März 2015, 16:46

Das ist korrekt so, ohne GUI reicht 'sudo', da ich aber die GUI drin habe geht's halt nur mit 'gksudo'.
smile-1969
User
Beiträge: 20
Registriert: Sonntag 22. März 2015, 16:46

Sorry, hatte deinen Hinweis mit der Namensänderung überlesen. Habe es geändert, kann es aber morgen erst testen. War zu sehr damit beschäftigt die slots der buttons zu deuten. 'partial' ist mir völlig neu.
smile-1969
User
Beiträge: 20
Registriert: Sonntag 22. März 2015, 16:46

Nach ein paar Änderungen läuft das Programm fast korrekt: Je nach Anzahl der LED_PINS passt sich entsprechend der Inhalt der ComboBox an.
Das einzige was bis dato nicht funktioniert ist das schalten mittels der Pushbuttons. Egal welcher, beide habe 'clicked' keine Schaltfunktion.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wird denn die Slot-Methode überhaupt betreten? (``print`` einbauen!) Wenn nein, hast Du die Verbindung falsch definiert; wenn ja, stimmt etwas an der Logik nicht!

Ohne Code können wir dazu natürlich noch weniger sagen ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
smile-1969
User
Beiträge: 20
Registriert: Sonntag 22. März 2015, 16:46

Holy Moly....sorry, selbstverständlich läuft das Programm....hatte bei der 'currentIndex'-Abfrage einen Tippfehler in der Combobox-Bezeichnung!
...schwer zu ertragen, daß immer nur ich schuld bin...!
Super, freue mich wahnsinnig das es endlich läuft! Hätte ich alleine auch nicht hingekriegt. Danke!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

smile-1969 hat geschrieben:Holy Moly....sorry, selbstverständlich läuft das Programm....hatte bei der 'currentIndex'-Abfrage einen Tippfehler in der Combobox-Bezeichnung!
Dann hätte es eigentlich einen Fehler (``NameError``) geben müssen! (Oder war es eine andere ComboBox?)
smile-1969 hat geschrieben: ...schwer zu ertragen, daß immer nur ich schuld bin...!
Hehe... naja, wenn man etwas "macht", dann macht man eben auch Fehler ;-) Gehört einfach dazu - und ist doch auch befriedigend, wenn es denn mal läuft (und man sogar vesteht, *wieso*) :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
smile-1969
User
Beiträge: 20
Registriert: Sonntag 22. März 2015, 16:46

An allen Positionen wo die Bezeichnung der Combobox nicht korrekt war, wurde der Fehler angezeigt, bloß nicht in der def-Funktion. Was soll's, je mehr ich suchen muss, desto mehr verstehe ich. Na ja, "verstehen" trifft auch nicht an jedem Punkt zu, wohl mehr "erahnen"...
Programmiere sonst in Assembler und dachte ich könnte mal eben quer in Python einsteigen (learning by dying...also so ein wenig kann man sich am Anfang ja zurecht basteln, aber für 'ne Struktur wie im Beispiel fehlen dann einfach die Grundlagen-und mit Assembler-Logik hat das leider rein gar nichts zu tun. Auf alle Fälle hilfreich ein vernünftiges, funktionierendes Beispiel zu haben-das hilft schon über den ein oder anderen Frustlevel hinweg.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@smile-1969:
Vielleicht solltest Du zu Anfang nicht zuviel erwarten. Wenn Du sonst nur Assembler programmierst, fehlen Dir wahrscheinlich basale Paradigmen wie OOP, Ereignisgesteuerte Programmierung usw. Hinzu kommt, dass Qt eigene Paradigmen wie z.B. die Signal-Slot-Idee mitbringt und die Doku für C++ geschrieben ist (fürs Verständnis reichen aber C++ Grundkenntnisse). Das ist zugegeben recht viel für einen "Mal-Eben-Quereinstieg".
smile-1969
User
Beiträge: 20
Registriert: Sonntag 22. März 2015, 16:46

Habe jetzt ein wenig mit der Combobox experimentiert und habe noch zwei Fragen zum Programmbeispiel, weil ich mir nicht sicher bin, ob ich das korrekt verstanden habe:

1. 'partial' : Damit verknüpfe ich die Werte miteinander-welche Led-Pins mit welchem index verbunden sind.
Wie kann ich steuern, welche Werte miteinander verknüpft werden bzw. wie kann ich andere Wertegruppen einbeziehen?
Muss ich dazu eine neue Klasse definieren?
2.

Code: Alles auswählen

    def on_led_button(self, state):
        index = self.ui.ledCombo.currentIndex()
        if index != -1:
            GPIO.output(self.led_pins[index], state)
'if index != -1' ist doch immer erfüllt, sobald die Combobox mit Inhalt bepackt ist. Ist das also so 'ne Art Sicherung, falls das
Programm (die GUI) spinnt?
Danke!
BlackJack

@smile-1969: 1. `partial()` nimmt eine Funktion oder Methode und Werte und erstellt eine neue Funktion, die wenn man sie Aufruft die übergebene Funktion/Methode mit den Werten aufruft, wobei man eventuell noch weitere Werte angeben muss wenn man bei `partial()` nicht für alle Argumente der übergebenen Funktion/Methode Werte übergeben hat.

Code: Alles auswählen

In [4]: operator.add(42, 23)
Out[4]: 65

In [5]: add_answer = partial(operator.add, 42)

In [6]: add_answer(23)
Out[6]: 65

In [7]: add_answer(10)
Out[7]: 52

In [8]: add_answer(-4)
Out[8]: 38
Im Programm erstelle ich also eine Funktion die `self.on_led_button()` mit `True` als Argument aufruft für den einen Button und eine die das selbe mit `False` als Argument macht für den anderen. Weil `connect()` eine Funktion erwartet die *kein* Argument erwartet. Der Index in die Pin-Nummern hat damit überhaupt nichts zu tun.

2. Die Pin-Nummern werden der Klasse ja als Argument übergeben. Da könnte ja durchaus eine leere Liste übergeben werden und damit würden keine Einträge in die Combobox geschrieben und damit kann -1 als Wert in der Methode tatsächlich vorkommen.
smile-1969
User
Beiträge: 20
Registriert: Sonntag 22. März 2015, 16:46

Alles klar! Ab jetzt ist 'partial' auch mein Freund :wink: ...ein einfaches Beispiel erklärt oft mehr als tausend Google-Seiten! :!:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Bevor du dich mit Google rumschlägst um Funktionen zu suchen, solltest du am besten gleich die Python-Dokumentation benutzen. Das spart unnötig viel Arbeit und du hast die Informationen direkt von der Quelle. Zu partial gibt es dort auch ein kleines Beispiel. Das ist in den meisten Fällen so.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wir hatten zu ``partial`` auch einst einen tollen Beitrag hier im Forum... ich weiß nur nicht mehr, *wer* der Regulars dieses Beispiel gepostet hatte... da wurde ``partial`` selber hergeleitet und am Schluss dann eben das vorhandene verlinkt. Ich meine Leonidas war das... aber ich finde den Beitrag einfach nicht :-(
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
smile-1969
User
Beiträge: 20
Registriert: Sonntag 22. März 2015, 16:46

Habe mir das ganze mal ohne 'partial' etc. zusammengebastelt, hat mir selbst gut geholfen die einzelnen Schritte zu verstehen...aber Wahnsinn, das Script wird elendig lang! Im Gegensatz zu Assembler bietet Python da wirklich erstaunliche Möglichkeiten. Völlig suspekt ist mir bis dato alles was mit Klassen, Objekten, parents, children etc...zusammenhängt. Werde mir jetzt erstmal passende Lektüre besorgen und mich in dieser Hinsicht durch das Forum/Web kämpfen.
Würde gerne für alle die den selben schmalen Wissens-Status erleiden wie ich, mein extrem vereinfachtes Beispiel in diesem Thema einstellen, damit für alle Anfänger deutlich wird wie einfach die Nutzung einer Combobox ist.
Mein einfaches Beispiel funktioniert, aber es wäre nett wenn ihr dann noch mal ein Auge darauf werfen könntet-möchte schließlich niemanden mit falschen Infos versorgen! (Anfang nächste Woche)
Und ganz ehrlich, jetzt, wo das ein oder andere funktioniert - da fängt es richtig an Spaß zu machen!
BlackJack

@smile-1969: Wenn Die alles mit Objekten völlig suspekt ist: *Alle* Werte in Python sind Objekte. Es gibt also kein Programm, ausser vielleicht einem völlig Leeren, wo Du nicht mit mindestens einem Objekt zu tun hast. ;-)

Der Sprung von Assembler zu einem GUI-Rahmenwerk wie Qt ist aber auch ein ziemlich weiter Sprung.
Antworten