return aus einem clicked.connect

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Ernie1412
User
Beiträge: 160
Registriert: Freitag 10. Januar 2020, 20:38

wie kann ich ein return (Antwort) aus einem Button.click.connect erhalten
Hier mein Script:

Das "Titel_Name_Auswahl.ui" hat 2 radioButtons
ich wähle eins aus und klicken auf OK "self.TitelAuswahlW.OKBtnAuswahl.clicked.connect(self.Auswahl(Ergebnis))"

Code: Alles auswählen

from PyQt5 import QtWidgets, uic, QtCore,QtGui
import os,sys,functools
pfad = os.path.dirname(os.path.abspath(__file__))
class Haupt_Fenster(QtWidgets.QMainWindow):
    def __init__(self):
        super(Haupt_Fenster, self).__init__()
        Ergebnis=self.Zwei_Auswahl("jhjshdshjhsj","Oh what a Shit" )
        print(Ergebnis)
    def Zwei_Auswahl(self,alt,neu):                           
        #Fenster Anzeige
        self.TitelAuswahlW=uic.loadUi(os.path.join(pfad+ r'\\ui\\Titel_Name_Auswahl.ui'))        
        #self.TitelAuswahlW.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.WindowStaysOnTopHint| 
                              #
        alt="jhjshdshjhsj"
        neu="Oh what a Shit" 
        Ergebnis=""     
        self.TitelAuswahlW.show()
        self.TitelAuswahlW.rBtnName_alt.setText(alt)
        self.TitelAuswahlW.rBtnName_neu.setText(neu)
        self.TitelAuswahlW.OKBtnAuswahl.clicked.connect(self.Auswahl(Ergebnis))
        self.TitelAuswahlW.exec_()
        return Ergebnis
    def Auswahl(self,Ergebnis):        
        if self.TitelAuswahlW.rBtnName_neu.isChecked:
            Ergebnis=self.TitelAuswahlW.rBtnName_neu.text()
        else:
            Ergebnis=self.TitelAuswahlW.rBtnName_alt.text()            
        self.TitelAuswahlW.hide() 
        return Ergebnis

app = QtWidgets.QApplication(sys.argv)
MainWindow = Haupt_Fenster() 
MainWindow.show()   
sys.exit(app.exec_()) 
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Das sind gleich mehrere "Probleme". Du verwendest die falsche Schreibweise für die Methoden und Attribute.
Methoden klein und Wörter mit einem Unterstrich getrennt.
Variablen und Attribute klein und Wörter mit einem Unterstrich getrennt.

QT nutzt für alle Methoden die camelCaseSchreibweise, wo der erste Buchstabe immer klein ist.
D.h. aber nicht, dass man das im Python-Programmcode übernimmt. Dort weiterhin an die PEP8 halten.
os habe ich durch Path ersetzt, schließlich nutzen wir modernes Python.

Zur eigentlichen Frage: Du kannst keine Objekte der aufrufenden Funktion/Methode einfach so übergeben.
Mir sind 2 Möglichkeiten bekannt. Einmal wie man es mit QT machen würde.
QT: https://doc.bccnsoft.com/docs/PyQt5/signals_slots.html

Die andere Lösung ist naheliegend. Einfach die Attribute der Instanz zuweisen und in der Methode auf diese zuvor gesetzten Attribute zugreifen.
Dafür gibt es die OOP.

Testen konnte ich das nicht, da du nur die Hälfte an Informationen zur Verfügung gestellt hast. Die UI-File fehlt.
Wenn man Hilfe benötigt, stellt man normalerweise alles zur Verfügung, damit andere nicht danach extra fragen müssen.

Code: Alles auswählen

import sys
from pathlib import Path

from PyQt5 import QtCore, QtGui, QtWidgets, uic

pfad = Path(__file__).absolute().parent
ui_file = pfad / "ui/Titel_Name_Auswahl.ui"


class Haupt_Fenster(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.ergebnis = self.zwei_auswahl("jhjshdshjhsj", "Oh what a Shit")
        print(self.ergebnis)

    def zwei_auswahl(self, alt, neu):
        """
        Fenster Anzeige
        """

        # uic.loadUi kann auch mit Path objekten umgehen.
        # das funktioniert nicht überall
        # und deswegen muss man manchmal die Path objekte in ein str umwandeln
        self.TitelAuswahlW = uic.loadUi(ui_file)

        # self.TitelAuswahlW.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.WindowStaysOnTopHint|
        #
        alt = "jhjshdshjhsj"
        neu = "Oh what a Shit"
        self.ergebnis = ""
        self.TitelAuswahlW.show()
        self.TitelAuswahlW.rBtnName_alt.setText(alt)
        self.TitelAuswahlW.rBtnName_neu.setText(neu)
        self.TitelAuswahlW.OKBtnAuswahl.clicked.connect(self.auswahl)
        self.TitelAuswahlW.exec_()
        return Ergebnis

    def auswahl(self):
        if self.TitelAuswahlW.rBtnName_neu.isChecked:
            self.ergebnis = self.TitelAuswahlW.rBtnName_neu.text()
        else:
            self.ergebnis = self.TitelAuswahlW.rBtnName_alt.text()
        self.TitelAuswahlW.hide()

        return self.ergebnis


app = QtWidgets.QApplication(sys.argv)
MainWindow = Haupt_Fenster()
MainWindow.show()
sys.exit(app.exec_())

sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Ernie1412
User
Beiträge: 160
Registriert: Freitag 10. Januar 2020, 20:38

Danke für deine Hilfe
os habe ich durch Path ersetzt, schließlich nutzen wir modernes Python.
<--- funktionierte nicht
Ich hab die Code getestet, er bringt mir auch den richtigen Pfad, aber komischerweise kommt kein Fenster oder es lag an self.TitelAuswahlW=uic.loadUi...

Aber riesigen dank das mit self.ergebnis
war eigentlich logisch, ich hatte das mit Json übergehen versucht, viel zu aufwändig :)
Also das "ergebnis" in eine json speicher und dann wieder laden.

ich bin halt kein studierten, ich mach einfach learning by doing :)
wenns klappt super , wenn nicht such ich hilfe im netz u.a. auch hier.
das mit großschreibung und unterstrich ist für mich dann einfacher zu vestehen, was wofür steht und bisher hat python mir kein Fehler ausgegeben.
Ernie1412
User
Beiträge: 160
Registriert: Freitag 10. Januar 2020, 20:38

Path geht doch, hab jetzt alles durch path ersetzt.
man muss aber bei setPixmap in str umwandeln. Path scheint wohl ein extra WindowsPath Format zu sein.
Dann wandelt er von "/" in "\" um.
hat path eigentlich ein spezielle Vorteil gebenüber os ? (ausser das ohne dieses "\\" extra umwandeln muss. Manchmal gibts da konflikte)
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ernie1412: Nee, die haben `pathlib` extra neu geschrieben und in die Standardbibliothek aufgenommen weil das lauter Nachteile gegenüber den Funktionen in `os` und `os.path` hat. 🙄
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten