Automatisiert Button drücken nachdem GUI geladen wurde

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Kai-Behncke2
User
Beiträge: 3
Registriert: Montag 18. November 2019, 19:42

Hallo liebe Leute,
ich habe eine Gui erstellt mit verschiedenen Buttons.

Uch suche nun eine Möglichkeit, dass ein Button gedrückt wird OHNE (!!), dass auf diesen manuell gedrückt wird.

Bislang sieht es so aus:

Code: Alles auswählen

class alkisImportDlg(QDialog, alkisImportDlgBase):
 
    def __init__(self):
        QDialog.__init__(self)
        self.setupUi(self)
        self.setWindowIcon(QIcon('logo.svg'))
        self.setWindowFlags(Qt.WindowMinimizeButtonHint)
        self.leSERVICE.setText(s.value("service", ""))
        self.leHOST.setText(s.value("host", "xxxx.xxxxxren.intern"))
        self.lePORT.setText(s.value("port", "5432"))
        self.leDBNAME.setText(s.value("dbname", "alkisnas7"))
        .....
        ......
       self.pbStart.clicked.connect(self.run)
In meiner ui-Datei ist der Button wie folgt definiert:
<item>
<widget class="QPushButton" name="pbStart">
<property name="text">
<string>Starten</string>
</property>
</widget>
</item>

Wonach ich jedoch mittlerweile einigermaßen verzweifelt suche ist eine Möglichkeit, dass der Button durch den Code "gedrückt" wird, nachdem die Gui geladen ist.
Kennt jemand da eine Möglichkeit?

Danke im Voraus, Kai
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum rufst Du nicht einfach `run` direkt auf?
Kai-Behncke2
User
Beiträge: 3
Registriert: Montag 18. November 2019, 19:42

Hallo Sirius,

danke für die Antwort. Darauf wird es dann wohl hinauslaufen.
Ich habe nun alle Variablen, die eigentlich durch die GUI übermittelt werden, im Source-Code hart kodiert.

Trotzdem ist mir nicht ganz klar, wie ich "run" nun starte.

Bislang war es so, dass die Gui über

Code: Alles auswählen

dlg = alkisImportDlg()

dlg.exec_()
aufgerufen wurde.

Ich habe nun versucht z.B.:

Code: Alles auswählen

dlg=run()
dlg.exec_()
...ohne Erfolg.

Die Funktion "run" ist wie folgt definiert:

Code: Alles auswählen

def run(self):
        self.importALKIS()
Was mir völlig unklar ist: Was bedeutet dieses "self"?
Hast Du einen Tipp, wie ich run(self) direkt starten kann, ohne die Gui?

Danke und Grüße, Kai
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das "self" ist absolute Python OO Grundlage. Ohne das zu verstehen wirst du nicht weit kommen. Und die Syntax oben mit "dlg=run()" ist wild geraten. Du musst schon ein bisschen Python koennen, wenn du darin programmieren willst.

run ist eine Methode einer Klasse. self ist die Referenz auf die Instanz einer Klasse. Ein simples Beispiel:

Code: Alles auswählen

class BMW3er:

    def aufraeumen(self):
        print(f"ich habe {self} aufgeraeumt")

mein_auto = BMW3er()
irgend_jemandes_anderes_auto = BMW3er()
mein_auto.aufraeumen()
Klassen sind also eine Art Blaupause fuer Objekte. Methoden sind Vorgaenge die man mit einer Instanz einer Klasse machen kann, und dann erzeugt man konkrete Instanzen von Klassen, und arbeitet mit denen indem man eine Methode aufruft. Wie du siehst geht das nicht mit mein_auto=aufraeumen(). Sondern anders.

GUI- und Qt-Programmierung im besonderen erfordern eine ganze Reihe von Programmierkenntnissen - die musst du dir draufschaffen, mit zusammenstuempern wird das nichts werden.
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kai-Behncke2: aus Deinen Programmfetzen wird mir nicht klar, was Du eigentlich erreichen willst. Am Anfang war es einen Knopfklick zu "simulieren", jetzt scheint es so zu sein, dass Du einen Dialog öffnen oder schließen willst? Ich versteh es einfach noch nicht.

Kannst Du mal von Anfang an erzählen, was Du machen willst?
Benutzeravatar
__blackjack__
User
Beiträge: 14002
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kai-Behncke2: Ich vermute mal es geht um das hier: https://github.com/norBIT/alkisimport/b ... sImport.py

Die `run()`-Methode ist ja irgendwie ein bisschen zu klein um sinnvoll zu sein. Dafür ist dann die dort aufgerufene `importALKIS()`-Methode sportliche 544 Zeilen lang und die Programmlogik ist natürlich auch nicht sauber von der GUI getrennt. Ich sage da mal nichts weiter zu. 🤐 Bist nicht zu beneiden.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ah. Das erklaert natuerlich, wie so viel Code zustande kommt, und so wenig Verstaendnis fuer selbigen. Der Autor scheint doch noch aktiv, frag ihn doch einfach, ob er das als Feature einbaut.
Kai-Behncke2
User
Beiträge: 3
Registriert: Montag 18. November 2019, 19:42

Danke an alle für die Rückmeldungen. Habe es jetzt hinbekommen (ist, wenn man sich in den Code eingearbeitet hat, dann doch einfacher als gedacht).

Einfach innerhalb der Klasse, welche die Gui öffnet, den Befehl:

self.run()

setzen. Dann startet die Gui auch ohne, dass man die Startprozedur über den Button anklickt.
Das Ziel war letztlich automatisiert über eine Powershell-Prozedur die Anwendung regelmässig nachts zu starten, um immer wieder auf die neuesten Datenzugreifen zu können. Das setzt voraus, dass nicht "händisch" auf den Start-Button geklickt werden muss. Natürlich gibt es "elegantere" Wege, aber die gefundene Lösung erfüllt ihren Zweck.


Hilfreich generell bei der Fehleranalyse z.B. eine Ausgabe von Parametern z.B. über die QMessageBox:

QMessageBox.critical(None, "PyQt Demo", "BlaBlaBla", QMessageBox.Cancel)
Benutzeravatar
sparrow
User
Beiträge: 4528
Registriert: Freitag 17. April 2009, 10:28

Also "automatisiert" und "GUI" ist in der Regel unschön.
Wenn beim Programm GUI und Logik vernünftig getrennt sind, ist es wahrscheinlich einfacher, einfacher das ganze ohne Oberfläche abzubilden. Wenn das nicht sauber getrennt ist, sollte das wohl jemand tun.
Antworten