PyQt5 Window wechseln

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.
Antworten
Benutzeravatar
Gödel
User
Beiträge: 20
Registriert: Samstag 16. April 2022, 15:32

Hi und zwar möchte ich ein Startwindow erstellen welches, auf das drücken verschiedener Buttons reagiert und dann zu einem anderen Window wechselt(dieses Window funktioniert auch einwandfrei)
ich bekomme es nur nicht hin, dass beim drücken des Mathbuttons das Fenster wechselt.
Kann mir bitte irgendjemand helfen? Danke

Hier der Code(graphic):

Code: Alles auswählen

import random
import sys
from PyQt5.QtGui import QMovie
from PyQt5 import QtCore, QtGui, QtWidgets


class UiMainWindowMath(object):
    def setUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(600, 386)
        MainWindow.setMaximumSize(QtCore.QSize(600, 386))
        MainWindow.setStyleSheet("background-image: url(School.jpg)")
        MainWindow.setInputMethodHints(QtCore.Qt.ImhNoTextHandles)
        self.operation = ''
        self.level = 1
        self.answer = 0
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.check = QtWidgets.QPushButton(self.centralwidget)
        self.check.setGeometry(QtCore.QRect(280, 20, 111, 31))
        self.check.setAcceptDrops(False)
        self.check.setStyleSheet("font: 10pt \"Ravie\";")
        self.check.setObjectName("check")
        self.check.clicked.connect(self.checked)
        self.entry = QtWidgets.QLineEdit(self.centralwidget)
        self.entry.setGeometry(QtCore.QRect(420, 80, 141, 31))
        self.entry.setStyleSheet("font: 25 16pt \"Bahnschrift Light Condensed\";")
        self.entry.setText("")
        self.entry.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.entry.setClearButtonEnabled(True)
        self.entry.setObjectName("entry")
        self.badd = QtWidgets.QToolButton(self.centralwidget)
        self.badd.setGeometry(QtCore.QRect(260, 130, 121, 31))
        self.badd.setStyleSheet("font: 10pt \"Papyrus\";")
        self.badd.setObjectName("badd")
        self.badd.clicked.connect(self.add)
        self.bsub = QtWidgets.QToolButton(self.centralwidget)
        self.bsub.setGeometry(QtCore.QRect(400, 130, 121, 31))
        self.bsub.setStyleSheet("font: 10pt \"Papyrus\";")
        self.bsub.setObjectName("bsub")
        self.bsub.clicked.connect(self.subtract)
        self.bmul = QtWidgets.QToolButton(self.centralwidget)
        self.bmul.setGeometry(QtCore.QRect(260, 170, 121, 31))
        self.bmul.setStyleSheet("font: 10pt \"Papyrus\";")
        self.bmul.setObjectName("bmul")
        self.bmul.clicked.connect(self.multiply)
        self.bdiv = QtWidgets.QToolButton(self.centralwidget)
        self.bdiv.setGeometry(QtCore.QRect(400, 170, 121, 31))
        self.bdiv.setStyleSheet("font: 10pt \"Papyrus\";")
        self.bdiv.setObjectName("bdiv")
        self.bdiv.clicked.connect(self.divide)
        self.regler = QtWidgets.QSlider(self.centralwidget)
        self.regler.setGeometry(QtCore.QRect(20, 80, 160, 22))
        self.regler.setSliderPosition(10)
        self.regler.setOrientation(QtCore.Qt.Horizontal)
        self.regler.setObjectName("regler")
        self.regler.valueChanged.connect(self.updateRange)
        self.regler.setRange(1, 1000)
        self.hard = QtWidgets.QLabel(self.centralwidget)
        self.hard.setGeometry(QtCore.QRect(130, 60, 47, 13))
        self.hard.setObjectName("hard")
        self.easy = QtWidgets.QLabel(self.centralwidget)
        self.easy.setGeometry(QtCore.QRect(10, 60, 47, 13))
        self.easy.setObjectName("easy")
        self.task = QtWidgets.QGroupBox(self.centralwidget)
        self.task.setGeometry(QtCore.QRect(400, 10, 171, 61))
        self.task.setObjectName("task")
        self.tasklabel = QtWidgets.QLabel(self.task)
        self.tasklabel.setGeometry(QtCore.QRect(10, 20, 151, 31))
        self.tasklabel.setStyleSheet("font: 75 8pt \"MS Shell Dlg 2\";")
        self.tasklabel.setText("")
        self.tasklabel.setObjectName("tasklabel")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 600, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Learn_Trainer"))
        self.check.setText(_translate("MainWindow", "Check"))
        self.entry.setPlaceholderText(_translate("MainWindow", "0"))
        self.badd.setText(_translate("MainWindow", "Addition"))
        self.bsub.setText(_translate("MainWindow", "Subtraction"))
        self.bmul.setText(_translate("MainWindow", "Multiplication"))
        self.bdiv.setText(_translate("MainWindow", "Dividation"))
        self.hard.setText(_translate("MainWindow", "Hard"))
        self.easy.setText(_translate("MainWindow", "Easy"))
        self.task.setTitle(_translate("MainWindow", "Task"))

    def level_task(self, level):
        num1 = random.randint(0, level*10)
        num2 = random.randint(level, level*10)
        if self.operation == 'add':
            self.answer = num1 + num2
            self.tasklabel.setText(f'{num1} + {num2}')
        elif self.operation == 'sub':
            if num1 > num2:
                self.answer = num1 - num2
                self.tasklabel.setText(f'{num1} - {num2}')

            if num1 < num2:
                self.answer = num2 - num1
                self.tasklabel.setText(f'{num2} - {num1}')

        elif self.operation == 'mul':
            self.answer = num1 * num2
            self.tasklabel.setText(f'{num1} * {num2}')
        elif self.operation == 'div':
            run = False
            while not run:
                num1 = random.randint(1, level * 10)
                num2 = random.randint(level, level * 10)
                if num1 > num2 and num1 % num2 == 0:
                    self.answer = num1 / num2
                    self.tasklabel.setText(f'{num1} / {num2}')
                    run = True
                elif num1 < num2 and num2 % num1 == 0:
                    self.answer = num2 / num1
                    self.tasklabel.setText(f'{num2} / {num1}')
                    run = True
        else:
            self.tasklabel.setText('Choose an operation')


    def updateRange(self, value):
        self.level = value
        return self.level

    def add(self):
        self.operation = 'add'
        self.level_task(self.level)

    def subtract(self):
        self.operation = 'sub'
        self.level_task(self.level)

    def multiply(self):
        self.operation = 'mul'
        self.level_task(self.level)

    def divide(self):
        self.operation = 'div'
        self.level_task(self.level)

    def checked(self):

        try:
            if self.answer == int(self.entry.text()):
                self.tasklabel.setText('Correct')
                self.movie = QMovie("winner.gif")
                self.tasklabel.setMovie(self.movie)
                self.movie.start()
            else:
                self.tasklabel.setText(f'Wrong, correct: {self.answer}')
        except:
            self.tasklabel.setText(f'Wrong, correct: {self.answer}')





if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = UiMainWindowMath()
    ui.setUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
und hier der Code(start), welcher beim drücken des Mathbuttons graphic ausführen soll:

Code: Alles auswählen

from graphic import *

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(581, 388)
        MainWindow.setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.472, y1:0.494, x2:1, y2:1, stop:0 rgba(0, 47, 21, 255), stop:1 rgba(255, 255, 255, 255));")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setGeometry(QtCore.QRect(10, 10, 571, 331))
        self.groupBox.setStyleSheet("background-image: url(:/newPrefix/front.jpg);\n"
"font: 22pt \"Old English Text MT\";\n"
"color: rgb(255, 255, 255);")
        self.groupBox.setObjectName("groupBox")
        self.commandLinkButton = QtWidgets.QCommandLinkButton(self.groupBox)
        self.commandLinkButton.setGeometry(QtCore.QRect(110, 110, 111, 41))
        self.commandLinkButton.setStyleSheet("background-image: url(:/newPrefix/yellow.jpg);\n"
"color: rgb(0, 0, 0);\n"
"font: 10pt \"Ravie\";\n"
"background-color: rgb(255, 247, 17);")
        self.commandLinkButton.setObjectName("commandLinkButton")
        self.commandLinkButton.clicked.connect(self.english)
        self.line = QtWidgets.QFrame(self.groupBox)
        self.line.setGeometry(QtCore.QRect(250, 100, 3, 61))
        self.line.setStyleSheet("background-color: rgb(8, 8, 8);")
        self.line.setFrameShape(QtWidgets.QFrame.VLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.commandLinkButton_2 = QtWidgets.QCommandLinkButton(self.groupBox)
        self.commandLinkButton_2.setGeometry(QtCore.QRect(290, 110, 91, 41))
        self.commandLinkButton_2.setStyleSheet("font: 10pt \"Ravie\";\n"
"color: rgb(7, 7, 7);\n"
"background-image: url(:/newPrefix/blue.png);\n"
"background-color: rgb(0, 0, 255);")
        self.commandLinkButton_2.setObjectName("commandLinkButton_2")
        self.commandLinkButton_2.clicked.connect(self.math)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 581, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.groupBox.setTitle(_translate("MainWindow", "STDUY"))
        self.commandLinkButton.setText(_translate("MainWindow", "English"))
        self.commandLinkButton_2.setText(_translate("MainWindow", "Math"))

    def math(self):
        MainWindow = QtWidgets.QMainWindow()
        self.mwindow = UiMainWindowMath()
        self.mwindow.setUi(MainWindow)
        self.mwindow.show()

    def english(self):
        pass


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
PS: Ich weiß das die namen graphic und start nicht wirklich bezeichnend gewählt sind.
PPS: Danke für alle antworten
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Gödel: Bevor Du irgend etwas anderes machst, solltest Du aufhören in generiertem Code der eine deutliche Ansage im Kommentar gehabt haben dürfte, Änderungen vorzunehmen. Am besten generierst Du gar keinen Code sondern lädst die *.ui-Datei(en) zur Laufzeit.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Gödel
User
Beiträge: 20
Registriert: Samstag 16. April 2022, 15:32

@__blackjack__
Danke, wenn ich das dann zur Laufzeit lade, kann ich dann meine eigene Klasse von der in der *.ui erben lassen(existiert die dann überhaupt noch?(sorry ich hab noch nicht soviel ahnung vom Umgang mit ui Datein und GUIs generell) ? Oder wie kann ich dann Quasi die commandos für die Buttons übergeben?
Benutzeravatar
Gödel
User
Beiträge: 20
Registriert: Samstag 16. April 2022, 15:32

Ah das Commandos übergeben usw. hab ich selber rausgefunden. Ich probier jetzt erst mal ob ich es so hinbekommen mit dem wechseln, wenn ich es nicht schaffen sollte frag ich einfach nochmal mit dem neuen Code.
Antworten