Seite 1 von 2

Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 17:28
von xXSkyWalkerXx1
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

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 17:37
von __deets__
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.

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 17:43
von Sirius3
@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.

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 17:48
von xXSkyWalkerXx1
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?

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 17:54
von __deets__
Es gibt auch in C++ kein =! Auch da ist das !=.

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 17:58
von xXSkyWalkerXx1
Ups, meinte GPC und ni C++.

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 18:06
von xXSkyWalkerXx1
Und woran kann's nun liegen, dass es das 2. Fenster nicht öffnet?

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 18:08
von __deets__
Habe ich dir doch beantwortet.

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 18:12
von xXSkyWalkerXx1
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?

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 18:14
von __deets__
Nein. Interface. Das ist doch das, das nicht da bleibt?

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 18:17
von xXSkyWalkerXx1
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.

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 18:18
von __deets__
Wird hier permanent erwähnt: PEP8. Dazu gibt es sogar checker die das in deiner IDE automatisch prüfen.

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 18:25
von __blackjack__
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.

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 18:58
von xXSkyWalkerXx1
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?

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 19:02
von __deets__
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.

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 19:07
von xXSkyWalkerXx1
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...?^^

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 19:13
von __deets__
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?

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 19:23
von xXSkyWalkerXx1
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.

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 19:32
von __deets__
Das kann man mit Threads machen. Oder die Aufgaben in kleine Happen teilen und über QTimer triggern.

Re: Funktion einer Klasse wird nicht aufgerufen, obwohl sie funzt

Verfasst: Montag 13. Mai 2019, 21:33
von xXSkyWalkerXx1
Okay, danke - schaue ich mir morgen Mal an.