Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Abend Leutchen,

Nachdem ich versucht habe das Problem selbst zu lösen und ich auch Morpheu's Discordcommunity gefragt habe, aber da auch keiner was gefunden hat,
wende ich mich nun an die Pythoncommunity. ^^
Das gleiche Problem hatte ich schonmal in einem anderen Programm & konnte es da lösen, doch hier finde ich den Fehler nicht erneut.

Zum Problem:
Das Fenster (Funktion "verify") der Klasse "Login" an sich funktioniert & und das Fenster (Funktion "ui") der Klasse "Interface" an sich funktioniert (über direkten Aufruf außerhalb der Klassen getestet).
Das Problem ist, dass das Fenster der Klasse "Interface" beim Aufruf aus der Funktion der ersten Klasse nicht angezeigt/erzeugt wird, allerdings aufgerufen, da die Musik abgespielt wird.

Code: Alles auswählen

from PySide2.QtWidgets import QApplication , QMainWindow, QGridLayout, QHBoxLayout, QSplitter, QAction, QFrame, QPushButton, QLabel, QLineEdit, QComboBox, QMessageBox
from PySide2.QtGui import QIcon, QPixmap
from PySide2.QtCore import Qt
import sys,os,winsound
from twilio.rest import Client


class Login(QMainWindow):
    def verify_window(self):
        self.setGeometry(400,500,360,270)
        self.setWindowTitle("CRONUSMAX EXCLUSIVE [VIP]")
        self.setWindowIcon(QIcon("fortnite_img2.png"))
        self.setFixedSize(360,270)

        self.label1 = QLabel("<b><u>CronusMax Login</u><b>")
        self.label_un = QLabel("Username:")
        self.input_un = QLineEdit()
        self.label_pw = QLabel("Password:")
        self.input_pw = QLineEdit()
        self.label_why_reg = QLabel(">Why is a login needed?< So only ppl of CronusMax can it. :)")
        self.label_reg = QLabel('<a href=\"https://cronusmax.com/forums"> <font face= luckiestguy bold size=4 color=blue> Create new account</font> </a>')
        self.submit_btn = QPushButton("L O G I N")

        self.frame = QFrame()
        self.layout = QHBoxLayout()
        self.splitter = QSplitter(Qt.Vertical)
        self.layout.addWidget(self.splitter)
        
        for w in [self.label1,self.label_un,self.input_un,self.label_pw,self.input_pw,self.label_why_reg,self.label_reg,self.submit_btn]:
            self.splitter.addWidget(w)

        self.label1.setAlignment(Qt.AlignCenter)
        self.input_un.setStyleSheet('border: 1px solid; border-color:grey; border-radius: 6px;')
        self.input_pw.setStyleSheet('border: 1px solid; border-color:grey; border-radius: 6px;')
        self.input_pw.setEchoMode(QLineEdit.Password)
        self.label_reg.setOpenExternalLinks(True)
        self.label1.setStyleSheet('font-size: 24px; font-family: luckiestguy bold;')
        self.submit_btn.clicked.connect(self.login)

        self.setCentralWidget(self.frame)
        self.frame.setLayout(self.layout)
        self.show()
        winsound.PlaySound('SystemExclamation', winsound.SND_ASYNC)

    def login(self):
        username = self.input_un.text()
        password = self.input_pw.text()
        account_sid = 'xxxxxxxxxxxxxxxxxxxxxxxxx'
        auth_token = 'xxxxxxxxxxxxxxxxxxxxxxxxx'

        if username is not "" and password is not "":
            #client = Client(account_sid, auth_token)

            #message = client.messages.create(
                              #from_= 'whatsapp:+xxxxxxxxx',
                              #body = 'Login war erfolgreich!',
                              #to = 'whatsapp:+xxxxxxxxxx'
                          #)
            self.destroy()
            Interface().ui(username)
        else:
            self.statusBar().showMessage("You have forgott to enter something...")

        

class Interface(QMainWindow): 
    def ui(self,username):
        self.setGeometry(400,500,450,280)
        self.setWindowTitle("CRONUSMAX EXCLUSIVE **FORTNITE S.G.I** [VIP]")
        self.setWindowIcon(QIcon("fortnite_img2.png"))
        self.setFixedSize(500,280)
        self.statusbar = self.statusBar()
        self.statusbar.setStyleSheet('font: bold; color: yellow;')
        self.statusbar.showMessage("[ Programversion: 1.00 | Username: "+username+" | Game: Fortnite ]")
        
        self.menubar = self.menuBar()
        credit = self.menubar.addMenu("Credits")
        generate = self.menubar.addMenu("Generate")
        music = self.menubar.addMenu("Music")
        _exit = self.menubar.addMenu("Exit")
        c = QAction(QIcon("programmer.png"),"Programmer",self)
        c.triggered.connect(self.show_credits)
        credit.addAction(c)
        g = QAction(QIcon("generate.png"),"Script",self)
        g.triggered.connect(self.generate_script)
        generate.addAction(g)
        m1 = QAction(QIcon("music_on.png"),"Turn On",self)
        m1.triggered.connect(lambda: winsound.PlaySound("theme.wav",winsound.SND_ASYNC | winsound.SND_LOOP))
        music.addAction(m1)
        m2 = QAction(QIcon("music_off.png"),"Turn Off",self)
        m2.triggered.connect(lambda: winsound.PlaySound(None,winsound.SND_ASYNC))
        music.addAction(m2)
        e = QAction(QIcon("exit.png"),"Exit",self)
        e.triggered.connect(self.exit_app)
        _exit.addAction(e)

        self.label1 = QLabel("<b> AimAbuse:</b>")
        self.label2 = QLabel("<b> RapidFire:</b>")
        self.label3 = QLabel("<b> NoRecoil:</b>")
        self.label4 = QLabel("<b> AutoRun:</b>")
        self.cb1 = QComboBox()
        self.cb2 = QComboBox()
        self.cb3 = QComboBox()
        self.cb4 = QComboBox()
        self.le1 = QLineEdit()
        self.le2 = QLineEdit()
        self.le3 = QLineEdit()
        self.le4 = QLineEdit()
        self.le5 = QLineEdit()
        self.frame = QFrame()

        self.setStyleSheet('QMainWindow {border-image: url("bg3.jpg");}')
        self.frame.setStyleSheet('background: transparent;') 
        self.le1.setPlaceholderText("Zoom - In value [int]")
        self.le2.setPlaceholderText("Zoom - Out value [int]")
        self.le3.setPlaceholderText("fire-rate [int]")
        self.le4.setPlaceholderText("value for slow guns [int]")
        self.le5.setPlaceholderText("value for fast guns [int]")

        for l in [self.label1,self.label2,self.label3,self.label4]:
            l.setStyleSheet('background-color: yellow;')
        for w in [self.le1,self.le2,self.le3,self.le4,self.le5,self.cb1,self.cb2,self.cb3,self.cb4]:
            w.setStyleSheet('background-color: light grey;')
        for i in [self.cb1,self.cb2,self.cb3,self.cb4]:
            i.addItem(QIcon("mod_off.png"),"OFF")
            i.addItem(QIcon("mod_on.png"),"ON")

        self.layout = QGridLayout()
        self.layout.addWidget(self.label1,0,0)
        self.layout.addWidget(self.cb1,   0,1)
        self.layout.addWidget(self.le1,   0,2)
        self.layout.addWidget(self.le2,   0,3)
        self.layout.addWidget(self.label2,1,0)
        self.layout.addWidget(self.cb2,   1,1)
        self.layout.addWidget(self.le3,   1,2)
        self.layout.addWidget(self.label3,2,0)
        self.layout.addWidget(self.cb3,   2,1)
        self.layout.addWidget(self.le4,   2,2)
        self.layout.addWidget(self.le5,   2,3)
        self.layout.addWidget(self.label4,3,0)
        self.layout.addWidget(self.cb4,   3,1)
        self.layout.setContentsMargins(10,0,10,0)
        
        self.setCentralWidget(self.frame)
        self.frame.setLayout(self.layout)
        self.show()
        winsound.PlaySound("theme.wav",winsound.SND_ASYNC | winsound.SND_LOOP)
        
    def show_credits(self):
        self.mb = QMessageBox()
        self.mb.setWindowTitle("Owner of this programm")
        self.mb.setWindowIcon(QIcon("programmer.png"))
        self.mb.setText("CopyRight© 2019 - 2020, nostradamus - all rights reserved!\n\nSelling this program is against the laws and will punished.\nIt's written in PySide2 - LGPL licence.")
        self.mb.setStandardButtons(QMessageBox.Ok)
        self.mb.setIconPixmap(QPixmap("programmer.png").scaledToHeight(55))
        self.mb.exec_()
        
    def generate_script(self):
        with open(os.path.expanduser('~')+'\Desktop\nostradamus_fortnite[script].gpc',"w",encoding="utf-8") as script_file:
            script_file.write("<GPC CODE>")
    
    def exit_app(self):
        winsound.PlaySound('SystemExit',winsound.SND_ASYNC)
        self.destroy()
        app.quit()



app = QApplication(sys.argv)
start = Login()
start.verify_window()
sys.exit(app.exec_())

#EDITED
Als ich schonmal das Problem hatte konnte ich das Problem lösen - wie auch immer.
Da war es auch nur ein minimaler Fehler, wenn ich doch nur wüsste was es für einer war. :I

Grüße,
xXSkyWalkerXx1
Zuletzt geändert von xXSkyWalkerXx1 am Montag 13. Mai 2019, 17:41, insgesamt 2-mal geändert.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ui. Ganz schön hässlich. Wieso du Labels etc durchnummerierst, statt Ihnen sinnvolle Namen ihres Zweckes nach zu geben ist mir schleierhaft.

Und die Variable für Interface groß I zu nennen ist auch ungewöhnlich. Variablen schreibt man klein.

Last but not least: du erzeugst ein Widget, ohne es entweder an self zu binden. Oder ein Parent zu übergeben. Womit es prompt als Müll wieder abgeräumt wird.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@xXSkyWalkerXx1: das sieht alles sowas von falsch aus. Es macht keinen Sinn, alle mögliche Labels an self zu binden, oder die GUI nicht über .ui-Datein in __init__ aufzubauen.
Auch dass eine Methode login ein weitere Fenster-Instanz erzeugt, die aber gleich wegschmeißt.
Strings per ›is‹ zu vergleichen ist falsch.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Sirius3 hat geschrieben: Montag 13. Mai 2019, 17:43 @xXSkyWalkerXx1: das sieht alles sowas von falsch aus. Es macht keinen Sinn, alle mögliche Labels an self zu binden, oder die GUI nicht über .ui-Datein in __init__ aufzubauen.
Auch dass eine Methode login ein weitere Fenster-Instanz erzeugt, die aber gleich wegschmeißt.
Strings per ›is‹ zu vergleichen ist falsch.
Hab mich zum Vergleich nochmal belesen. Ich weiß, dass es aus GPC das "=!" gibt und da diese Sprache C# sehr nahe sein soll, hatte ich das bei Python probiert - ging ni, also dachte ich man macht es mit "is not".
Okay, jetzt weiß ich, dass man es mit "!=" machen kann - danke!

Meinst mit
oder die GUI nicht über .ui-Datein in __init__ aufzubauen
, dass ich die Widgets in der "__init__" erzeugen soll und in "verify_window" bloß platzieren soll?
Zuletzt geändert von xXSkyWalkerXx1 am Montag 13. Mai 2019, 17:59, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt auch in C++ kein =! Auch da ist das !=.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Ups, meinte GPC und ni C++.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Und woran kann's nun liegen, dass es das 2. Fenster nicht öffnet?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Habe ich dir doch beantwortet.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Ach, wegen dem Widget was wegfällt, da ich es nicht an self gebunden habe?
Aber welches Widget meinst? Z.B.

Code: Alles auswählen

 credit = self.menubar.addMenu("Credits") 
oder welches?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Interface. Das ist doch das, das nicht da bleibt?
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Ach du Scheiße - na klar!!! -.-
Hm, kleiner Fehler, große Wirkung.

Hier meckert ja immer so über meine Syntaxschreibweise - da muss ich jetzt Mal nach Tips fragen, um es normengerecht zu schreiben.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wird hier permanent erwähnt: PEP8. Dazu gibt es sogar checker die das in deiner IDE automatisch prüfen.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Nur mal als kleine Demonstration warum ``is`` der falsche Operator ist:

Code: Alles auswählen

In [173]: a
Out[173]: 'parrot'

In [174]: b
Out[174]: 'parrot'

In [175]: a is b
Out[175]: False

In [176]: a == b
Out[176]: True
Objekte können den gleichen Wert haben, ohne tatsächlich das selbe Objekt zu sein.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Okay, ich schau mir Mal so ein PEP8-Guide an.

Mal 'ne andere Frage, welches Modul brauche ich, um die Funktion "login" aufzurufen und während dessen das Fenster laufen zu lassen - Threading oder MultiProcessing?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weder noch. Was soll denn gehen, während man nicht eingeloggt ist? Und was daran geht nicht? Die kannst ja tausende Widgets darstellen und benutzen - Fokus hat halt immer nur eines. Ob das sinnvoll ist von der Benutzerinteraktion steht auf nem anderen Blatt.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Naja, das Problem ist (hätte ich vllt im Vorraus erwähnen sollen), dass, sobald man auf "login" (Button) drückt, das Fenster solange nicht reagiert, bis es z.b. die WhatsApp-Nachricht gesendet hat.
Ich dachte eigentlich man mache das mit "Thread" oder "Process".

Wie kann man dann sowas machen? Etwa mit der "after" Methode, von der ich so viel lese...?^^
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du von der liest, dann wohl eher nicht im Zusammenhang mit Qt. Da sind das QTimer.

Man KANN das dann mit einem Thread oder Prozess machen. Man kann auch asyncio oder ähnliches verwenden. Wobei ich das generell in frage stellen würde. Was soll der Benutzer denn tun, solange der Login Vorgang läuft?
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Na tun soll er nichts, das Problem ist nur, dass wenn man dann auf's Fenster klickt (sollte der Vorgang wegen schlechten Internets länger dauern) es nicht reagiert...der Benutzer soll ja nicht denken, dass das Programm abgestürzt ist.

Das Gleiche bräuchte ich für meine Belegarbeit, die ich im Leistungskurs Mathe schreibe - da soll ich ein Programm schreiben, welches die lokalen & globale Minimas und Maximas berechnet - da soll ja auch nicht währenddessen kommen: "Fenster reagiert nicht" (oder so) , sollte man Mal aus Ungeduld auf's Fenster klicken, weil es vllt lange dauert.
Zuletzt geändert von xXSkyWalkerXx1 am Montag 13. Mai 2019, 19:32, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das kann man mit Threads machen. Oder die Aufgaben in kleine Happen teilen und über QTimer triggern.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Okay, danke - schaue ich mir morgen Mal an.
Antworten